我的网站(ASP.NET Core、Windows、使用 IIS 托管在 Azure 应用服务中)使用我的 Azure 存储帐户的 Azure 文件功能来读取和写入文件和目录。它使用普通的 System.IO 方法 File.Open 等来执行此操作。
只要存储帐户的网络页面上的“公共网络访问”设置为“从所有网络启用”,这一切都可以正常工作。
但是,我现在已使用虚拟网络将其锁定,因此只有我的应用程序服务可以与存储帐户进行通信。还为应用服务创建了托管标识,并为该标识提供了存储帐户上的 RBAC 角色“存储帐户贡献者”和“存储文件数据 SMB 共享贡献者”。
一旦我将存储帐户的网络页面上的“公共网络访问”设置为“从选定的虚拟网络和 IP 地址启用”,尝试写入文件现在会导致异常
UnauthorizedAccessException: Access to the path '\\mystorage.file.core.windows.net\mydirectory\mfile.txt' is denied.
但是,写入 blob 效果很好。因此应用程序服务确实到达了存储帐户。
我需要做什么才能使用只能从应用服务访问的存储帐户访问我的文件?我更愿意继续使用 System.IO 方法,这样我就不必修改应用程序。
要启用私有访问,您需要使用 Azure 私有端点。
在您的情况下,您需要为每个子资源创建一个专用端点,一个用于 blob 访问,另一个用于文件共享访问。
如果您使用 Terraform :
resource "azurerm_private_endpoint" "blob" {
name = "pe-stxxxx-blob"
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
subnet_id = azurerm_subnet.example.id
private_service_connection {
name = "example-privateserviceconnection"
private_connection_resource_id = azurerm_storage_account.example.id
subresource_names = ["blob"] <------
is_manual_connection = false
}
private_dns_zone_group {
name = "example-dns-zone-group"
private_dns_zone_ids = [azurerm_private_dns_zone.example.id]
}
}
resource "azurerm_private_endpoint" "file" {
name = "pe-stxxxx-file"
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
subnet_id = azurerm_subnet.example.id
private_service_connection {
name = "example-privateserviceconnection"
private_connection_resource_id = azurerm_storage_account.example.id
subresource_names = ["file"] <------
is_manual_connection = false
}
private_dns_zone_group {
name = "example-dns-zone-group"
private_dns_zone_ids = [azurerm_private_dns_zone.example.id]
}
}
参考资料: