Azure 檔案儲存體提供兩種主要的端點類型來存取 Azure 檔案共用:
- 公用端點,具有公用 IP 位址,並可從全球任何地方存取。
- 私人端點,存在於虛擬網路內,並具有該虛擬網路位址空間內的私人 IP 位址。
公用和私人端點都存在於 Azure 儲存體帳戶上。 儲存體帳戶是一種管理構造,所代表的是儲存體的共用集區,您可以在此集區中部署多個檔案共用,以及其他儲存體資源 (例如,Blob 容器或佇列)。
本文著重於如何設定儲存體帳戶的端點,以便直接存取 Azure 檔案共用。 本文的大部分內容也適用於 Azure 檔案同步如何與儲存體帳戶的公用和私人端點互通。 如需 Azure 檔案同步網路考量的詳細資訊,請參閱 設定 Azure 檔案同步 Proxy 和防火牆設定。
建議您先閲讀 Azure 檔案儲存體網路考量 ,再閱讀本指南。
適用於
| 檔案共用類型 |
SMB |
NFS |
| 標準檔案共用 (GPv2)、LRS/ZRS |
|
|
| 標準檔案共用 (GPv2)、GRS/GZRS |
|
|
| 進階檔案共用 (FileStorage)、LRS/ZRS |
|
|
先決條件
- 本文假設您已建立 Azure 訂用帳戶。 如果您還沒有訂用帳戶,則先建立免費帳戶,再開始操作。
- 本文假設在您要與內部部署環境建立連線的儲存體帳戶中,您已建立 Azure 檔案共用。 若要了解如何建立 Azure 檔案共用,請參閱建立 Azure 檔案共用。
- 如果您想要使用 Azure PowerShell,請安裝最新版本。
- 如果您想要使用 Azure CLI,請安裝最新版本。
端點設定
您可以設定端點,以限制對儲存體帳戶的網路存取。 有兩種方法可以將對於儲存體帳戶的存取限制在虛擬網路內:
建立私人端點
當您為儲存體帳戶建立私人端點時,會部署下列 Azure 資源:
-
私人端點:代表儲存體帳戶私人端點的 Azure 資源。 您可以將此視為連線儲存體帳戶和網路介面的資源。
-
網路介面 (NIC):維護指定虛擬網路/子網路中私人 IP 位址的網路介面。 這是當您部署虛擬機器 (VM) 時所部署的完全相同資源,但是不是指派給 VM,而是由私人端點所擁有。
-
私人網域名稱系統 (DNS) 區域:如果您之前尚未為此虛擬網路部署私人端點,則會為您的虛擬網路部署新的私人 DNS 區域。 同時也會為此 DNS 區域中的儲存體帳戶建立 DNS A 記錄。 如果您已在此虛擬網路中部署私人端點,新的儲存體帳戶 A 記錄將會新增至現有 DNS 區域。 部署 DNS 區域是選擇性的。 不過,強烈建議您這麼做,且若您使用 AD 服務主體或 FileREST API 來掛接 Azure 檔案共用,則必須執行此動作。
附註
本文會針對 Azure 公用區域使用儲存體帳戶 DNS 尾碼 core.windows.net。 此評論也適用於 Azure 主權雲端,例如 Azure 美國政府雲端和由 21Vianet 雲端營運的 Microsoft Azure。 請為您的環境替換合適的尾碼。
瀏覽至您想要為其建立私人端點的儲存體帳戶。 從 [服務] 功能表的 [安全性 + 網络] 底下 ,選取 [網络]、 [私人端點連線],然後選取 [+ 私人端點] 以建立新的私人端點。
產生的精靈會有多個頁面需要完成。
在 [基本] 刀鋒視窗中,為您的私人端點選取所需的訂用帳戶、資源群組、名稱、網路介面名稱和區域。 您可以任意選取這些項目,而不一定要與儲存體帳戶相符,但您建立私人端點的所在區域,必須與您要在其中建立私人端點的虛擬網路相同。 然後選取 [下一步:資源]。
在 [資源] 刀鋒視窗中,選取目標子資源的 [檔案]。 然後選取 [下一步:虛擬網路]。
[虛擬網路] 刀鋒視窗可讓您選取要新增私人端點的特定虛擬網路和子網路。 為新的私人端點選取動態或靜態 IP 位址配置。 若選擇靜態,則您也必須提供名稱和私人 IP 位址。 您也可以選擇性指定應用程式安全性群組。 完成後,選取 [下一步:DNS]。
[DNS] 刀鋒視窗包括整合私人端點和私人 DNS 區域的資訊。 確定訂用帳戶和資源群組正確,然後選取 [下一步:標籤]。
您可以選擇性地套用標籤來分類您的資源,例如將 Environment 名稱和 Test 值套用到所有測試資源。 視需要輸入名稱/值組,然後選取 [下一步:檢閱 + 建立]。
選取 [建立] 以建立私人端點。
若要為您的儲存體帳戶建立私人端點,您必須先取得儲存體帳戶的參考,以及您要新增私人端點的虛擬網路子網路。 取代下方的 <storage-account-resource-group-name>、<storage-account-name>、<vnet-resource-group-name>、<vnet-name> 和 <vnet-subnet-name>:
$storageAccountResourceGroupName = "<storage-account-resource-group-name>"
$storageAccountName = "<storage-account-name>"
$virtualNetworkResourceGroupName = "<vnet-resource-group-name>"
$virtualNetworkName = "<vnet-name>"
$subnetName = "<vnet-subnet-name>"
# Get storage account reference, and throw error if it doesn't exist
$storageAccount = Get-AzStorageAccount `
-ResourceGroupName $storageAccountResourceGroupName `
-Name $storageAccountName `
-ErrorAction SilentlyContinue
if ($null -eq $storageAccount) {
$errorMessage = "Storage account $storageAccountName not found "
$errorMessage += "in resource group $storageAccountResourceGroupName."
Write-Error -Message $errorMessage -ErrorAction Stop
}
# Get virtual network reference, and throw error if it doesn't exist
$virtualNetwork = Get-AzVirtualNetwork `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $virtualNetworkName `
-ErrorAction SilentlyContinue
if ($null -eq $virtualNetwork) {
$errorMessage = "Virtual network $virtualNetworkName not found "
$errorMessage += "in resource group $virtualNetworkResourceGroupName."
Write-Error -Message $errorMessage -ErrorAction Stop
}
# Get reference to virtual network subnet, and throw error if it doesn't exist
$subnet = $virtualNetwork | `
Select-Object -ExpandProperty Subnets | `
Where-Object { $_.Name -eq $subnetName }
if ($null -eq $subnet) {
Write-Error `
-Message "Subnet $subnetName not found in virtual network $virtualNetworkName." `
-ErrorAction Stop
}
若要建立私人端點,您必須對儲存體帳戶建立私人連結服務連線。 私人連結服務連線是建立私人端點時的輸入項目。
# Disable private endpoint network policies
$subnet.PrivateEndpointNetworkPolicies = "Disabled"
$virtualNetwork = $virtualNetwork | `
Set-AzVirtualNetwork -ErrorAction Stop
# Create a private link service connection to the storage account.
$privateEndpointConnection = New-AzPrivateLinkServiceConnection `
-Name "$storageAccountName-Connection" `
-PrivateLinkServiceId $storageAccount.Id `
-GroupId "file" `
-ErrorAction Stop
# Create a new private endpoint.
$privateEndpoint = New-AzPrivateEndpoint `
-ResourceGroupName $storageAccountResourceGroupName `
-Name "$storageAccountName-PrivateEndpoint" `
-Location $virtualNetwork.Location `
-Subnet $subnet `
-PrivateLinkServiceConnection $privateEndpointConnection `
-ErrorAction Stop
建立 Azure 私人 DNS 區域可讓儲存體帳戶的原始名稱 (例如 storageaccount.file.core.windows.net) 解析為虛擬網路內的私人 IP。 雖然從建立私人端點的角度來看,這是選擇性項目,但直接使用 AD 使用者主體來掛接 Azure 檔案共用或透過 REST API 來存取時,這確實是必要項目。
# Get the desired storage account suffix (core.windows.net for public cloud).
# This is done like this so this script will seamlessly work for non-public Azure.
$storageAccountSuffix = Get-AzContext | `
Select-Object -ExpandProperty Environment | `
Select-Object -ExpandProperty StorageEndpointSuffix
# For public cloud, this will generate the following DNS suffix:
# privatelink.file.core.windows.net.
$dnsZoneName = "privatelink.file.$storageAccountSuffix"
# Find a DNS zone matching desired name attached to this virtual network.
$dnsZone = Get-AzPrivateDnsZone | `
Where-Object { $_.Name -eq $dnsZoneName } | `
Where-Object {
$privateDnsLink = Get-AzPrivateDnsVirtualNetworkLink `
-ResourceGroupName $_.ResourceGroupName `
-ZoneName $_.Name `
-ErrorAction SilentlyContinue
$privateDnsLink.VirtualNetworkId -eq $virtualNetwork.Id
}
if ($null -eq $dnsZone) {
# No matching DNS zone attached to virtual network, so create new one.
$dnsZone = New-AzPrivateDnsZone `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $dnsZoneName `
-ErrorAction Stop
$privateDnsLink = New-AzPrivateDnsVirtualNetworkLink `
-ResourceGroupName $virtualNetworkResourceGroupName `
-ZoneName $dnsZoneName `
-Name "$virtualNetworkName-DnsLink" `
-VirtualNetworkId $virtualNetwork.Id `
-ErrorAction Stop
}
現在您已有私人 DNS 區域的參考,接下來您必須為儲存體帳戶建立 A 記錄。
$privateEndpointIP = $privateEndpoint | `
Select-Object -ExpandProperty NetworkInterfaces | `
Select-Object @{
Name = "NetworkInterfaces";
Expression = { Get-AzNetworkInterface -ResourceId $_.Id }
} | `
Select-Object -ExpandProperty NetworkInterfaces | `
Select-Object -ExpandProperty IpConfigurations | `
Select-Object -ExpandProperty PrivateIpAddress
$privateDnsRecordConfig = New-AzPrivateDnsRecordConfig `
-IPv4Address $privateEndpointIP
New-AzPrivateDnsRecordSet `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $storageAccountName `
-RecordType A `
-ZoneName $dnsZoneName `
-Ttl 600 `
-PrivateDnsRecords $privateDnsRecordConfig `
-ErrorAction Stop | `
Out-Null
若要為您的儲存體帳戶建立私人端點,您必須先取得儲存體帳戶的參考,以及您要新增私人端點的虛擬網路子網路。 取代下方的 <storage-account-resource-group-name>、<storage-account-name>、<vnet-resource-group-name>、<vnet-name> 和 <vnet-subnet-name>:
storageAccountResourceGroupName="<storage-account-resource-group-name>"
storageAccountName="<storage-account-name>"
virtualNetworkResourceGroupName="<vnet-resource-group-name>"
virtualNetworkName="<vnet-name>"
subnetName="<vnet-subnet-name>"
# Get storage account ID
storageAccount=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "id" | \
tr -d '"')
# Get virtual network ID
virtualNetwork=$(az network vnet show \
--resource-group $virtualNetworkResourceGroupName \
--name $virtualNetworkName \
--query "id" | \
tr -d '"')
# Get subnet ID
subnet=$(az network vnet subnet show \
--resource-group $virtualNetworkResourceGroupName \
--vnet-name $virtualNetworkName \
--name $subnetName \
--query "id" | \
tr -d '"')
若要建立私人端點,您必須先確定子網路的私人端點網路原則已設定為停用。 然後,您可以使用 az network private-endpoint create 命令來建立私人端點。
# Disable private endpoint network policies
az network vnet subnet update \
--ids $subnet \
--disable-private-endpoint-network-policies \
--output none
# Get virtual network location
region=$(az network vnet show \
--ids $virtualNetwork \
--query "location" | \
tr -d '"')
# Create a private endpoint
privateEndpoint=$(az network private-endpoint create \
--resource-group $storageAccountResourceGroupName \
--name "$storageAccountName-PrivateEndpoint" \
--location $region \
--subnet $subnet \
--private-connection-resource-id $storageAccount \
--group-id "file" \
--connection-name "$storageAccountName-Connection" \
--query "id" | \
tr -d '"')
建立 Azure 私人 DNS 區域可讓儲存體帳戶的原始名稱 (例如 storageaccount.file.core.windows.net) 解析為虛擬網路內的私人 IP。 雖然從建立私人端點的角度來看,這是選擇性項目,但使用 AD 使用者主體來掛接 Azure 檔案共用或透過 REST API 來存取時,這確實是必要項目。
# Get the desired storage account suffix (core.windows.net for public cloud).
# This is done like this so this script will seamlessly work for non-public Azure.
storageAccountSuffix=$(az cloud show \
--query "suffixes.storageEndpoint" | \
tr -d '"')
# For public cloud, this will generate the following DNS suffix:
# privatelink.file.core.windows.net.
dnsZoneName="privatelink.file.$storageAccountSuffix"
# Find a DNS zone matching desired name attached to this virtual network.
possibleDnsZones=""
possibleDnsZones=$(az network private-dns zone list \
--query "[?name == '$dnsZoneName'].id" \
--output tsv)
dnsZone=""
possibleDnsZone=""
for possibleDnsZone in $possibleDnsZones
do
possibleResourceGroupName=$(az resource show \
--ids $possibleDnsZone \
--query "resourceGroup" | \
tr -d '"')
link=$(az network private-dns link vnet list \
--resource-group $possibleResourceGroupName \
--zone-name $dnsZoneName \
--query "[?virtualNetwork.id == '$virtualNetwork'].id" \
--output tsv)
if [ -z $link ]
then
echo "1" > /dev/null
else
dnsZoneResourceGroup=$possibleResourceGroupName
dnsZone=$possibleDnsZone
break
fi
done
if [ -z $dnsZone ]
then
# No matching DNS zone attached to virtual network, so create a new one
dnsZone=$(az network private-dns zone create \
--resource-group $virtualNetworkResourceGroupName \
--name $dnsZoneName \
--query "id" | \
tr -d '"')
az network private-dns link vnet create \
--resource-group $virtualNetworkResourceGroupName \
--zone-name $dnsZoneName \
--name "$virtualNetworkName-DnsLink" \
--virtual-network $virtualNetwork \
--registration-enabled false \
--output none
dnsZoneResourceGroup=$virtualNetworkResourceGroupName
fi
現在您已有私人 DNS 區域的參考,接下來您必須為儲存體帳戶建立 A 記錄。
privateEndpointNIC=$(az network private-endpoint show \
--ids $privateEndpoint \
--query "networkInterfaces[0].id" | \
tr -d '"')
privateEndpointIP=$(az network nic show \
--ids $privateEndpointNIC \
--query "ipConfigurations[0].privateIPAddress" | \
tr -d '"')
az network private-dns record-set a create \
--resource-group $dnsZoneResourceGroup \
--zone-name $dnsZoneName \
--name $storageAccountName \
--output none
az network private-dns record-set a add-record \
--resource-group $dnsZoneResourceGroup \
--zone-name $dnsZoneName \
--record-set-name $storageAccountName \
--ipv4-address $privateEndpointIP \
--output none
驗證連線能力
如果您的虛擬網路內有 VM,或已根據 [設定 Azure 檔案儲存體的 DNS 轉送] 所述設定 DNS 轉送,您可以測試私人端點是否已正確設定。 從 PowerShell、命令行或終端機執行下列命令(適用於 Windows、Linux 或 macOS)。 您必須將 <storage-account-name> 取代為適當的儲存體帳戶名稱:
nslookup <storage-account-name>.file.core.windows.net
如果成功,您應該會看到下列輸出,其中 192.168.0.5 是虛擬網路中私人端點的私人 IP 位址 (Windows 顯示的輸出):
Server: UnKnown
Address: 10.2.4.4
Non-authoritative answer:
Name: storageaccount.privatelink.file.core.windows.net
Address: 192.168.0.5
Aliases: storageaccount.file.core.windows.net
如果您的虛擬網路內有 VM,或已根據 [設定 Azure 檔案儲存體的 DNS 轉送] 所述設定 DNS 轉送,您可以執行下列命令來測試私人端點是否已正確設定:
$storageAccountHostName = [System.Uri]::new($storageAccount.PrimaryEndpoints.file) | `
Select-Object -ExpandProperty Host
Resolve-DnsName -Name $storageAccountHostName
如果成功,您應該會看到下列輸出,其中 192.168.0.5 是虛擬網路中私人端點的私人 IP 位址:
Name Type TTL Section NameHost
---- ---- --- ------- --------
storageaccount.file.core.windows CNAME 60 Answer storageaccount.privatelink.file.core.windows.net
.net
Name : storageaccount.privatelink.file.core.windows.net
QueryType : A
TTL : 600
Section : Answer
IP4Address : 192.168.0.5
如果您的虛擬網路內有 VM,或已根據 [設定 Azure 檔案儲存體的 DNS 轉送] 所述設定 DNS 轉送,您可以執行下列命令來測試私人端點是否已正確設定:
httpEndpoint=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "primaryEndpoints.file" | \
tr -d '"')
hostName=$(echo $httpEndpoint | cut -c7-$(expr length $httpEndpoint) | tr -d "/")
nslookup $hostName
如果一切成功,您應該會看到下列輸出,其中 192.168.0.5 是虛擬網路中私人端點的私人 IP 位址。 您仍應使用 storageaccount.file.core.windows.net 來掛載檔案共用,而不是 privatelink 路徑。
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
storageaccount.file.core.windows.net canonical name = storageaccount.privatelink.file.core.windows.net.
Name: storageaccount.privatelink.file.core.windows.net
Address: 192.168.0.5
限制公用端點存取
限制公用端點存取,首先需要您停用公用端點的一般存取。 停用對公用端點的存取並不會影響私人端點。 停用公用端點之後,您可以選取可能會繼續存取它的特定網路或 IP 位址。 一般而言,大部分的儲存體帳戶防火牆原則都會將網路存取限制在一或多個虛擬網路內。
停用公用端點的存取權
當公用端點的存取權停用時,仍然可以透過其私人端點來存取儲存體帳戶。 否則,將會拒絕對儲存體帳戶的公用端點發出的有效要求,除非這些要求來自於特別允許的來源。
瀏覽至您想要對其限制所有公用端點存取的儲存體帳戶。 在儲存體帳戶的目錄中,選取 [網路]。
在頁面頂端,選取 [已從選取的虛擬網路和 IP 位址啟用] 選項按鈕。 這會將一些設定取消隱藏,以控制公用端點的限制。 請選取 [允許受信任服務清單上的 Azure 服務存取此儲存體帳戶],以允許受信任的第一方 Microsoft 服務 (例如 Azure 檔案同步) 來存取儲存體帳戶。
下列 PowerShell 命令會拒絕所有傳送至儲存體帳戶公用端點的流量。 請注意,此命令會將 -Bypass 參數設定為 AzureServices。 這會允許受信任的第一方服務 (例如 Azure 檔案同步) 透過公用端點存取儲存體帳戶。
# This assumes $storageAccount is still defined from the beginning of this of this guide.
$storageAccount | Update-AzStorageAccountNetworkRuleSet `
-DefaultAction Deny `
-Bypass AzureServices `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Out-Null
下列 CLI 命令會拒絕所有傳送至儲存體帳戶公用端點的流量。 請注意,此命令會將 -bypass 參數設定為 AzureServices。 這會允許受信任的第一方服務 (例如 Azure 檔案同步) 透過公用端點存取儲存體帳戶。
# This assumes $storageAccountResourceGroupName and $storageAccountName
# are still defined from the beginning of this guide.
az storage account update \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--bypass "AzureServices" \
--default-action "Deny" \
--output none
將公用端點的存取限制在特定虛擬網路
當您將儲存體帳戶限制為特定的虛擬網路時,您會允許來自指定虛擬網路內的公用端點要求。 其運作方式是使用稱為「服務端點」的虛擬網路功能。 這可以搭配使用或不搭配使用私人端點。
瀏覽至您想要將其公用端點限制為特定虛擬網路的儲存體帳戶。 在儲存體帳戶的目錄中,選取 [網路]。
在頁面頂端,選取 [已從選取的虛擬網路和 IP 位址啟用] 選項按鈕。 這會將一些設定取消隱藏,以控制公用端點的限制。 選取 [+ 新增現有的虛擬網路],選取應允許透過公用端點存取儲存體帳戶的特定虛擬網路。 選取虛擬網路和該虛擬網路的子網路,然後選取 [啟用]。
請選取 [允許受信任服務清單上的 Azure 服務存取此儲存體帳戶],以允許受信任的第一方 Microsoft 服務 (例如 Azure 檔案同步) 來存取儲存體帳戶。
若要使用服務端點來將儲存體帳戶的公用端點存取限制為特定虛擬網路,我們必須先收集儲存體帳戶和虛擬網路的相關資訊。 填入 <storage-account-resource-group>、<storage-account-name>、<vnet-resource-group-name>、<vnet-name> 和 <subnet-name> 以收集這些資訊。
$storageAccountResourceGroupName = "<storage-account-resource-group>"
$storageAccountName = "<storage-account-name>"
$restrictToVirtualNetworkResourceGroupName = "<vnet-resource-group-name>"
$restrictToVirtualNetworkName = "<vnet-name>"
$subnetName = "<subnet-name>"
$storageAccount = Get-AzStorageAccount `
-ResourceGroupName $storageAccountResourceGroupName `
-Name $storageAccountName `
-ErrorAction Stop
$virtualNetwork = Get-AzVirtualNetwork `
-ResourceGroupName $restrictToVirtualNetworkResourceGroupName `
-Name $restrictToVirtualNetworkName `
-ErrorAction Stop
$subnet = $virtualNetwork | `
Select-Object -ExpandProperty Subnets | `
Where-Object { $_.Name -eq $subnetName }
if ($null -eq $subnet) {
Write-Error `
-Message "Subnet $subnetName not found in virtual network $restrictToVirtualNetworkName." `
-ErrorAction Stop
}
為了讓 Azure 網路的網狀架構允許來自虛擬網路的流量,進而取得儲存體帳戶公用端點,虛擬網路的子網路必須公開 Microsoft.Storage 服務端點。 下列 PowerShell 命令會將 Microsoft.Storage 服務端點新增至子網路 (如果尚未新增)。
$serviceEndpoints = $subnet | `
Select-Object -ExpandProperty ServiceEndpoints | `
Select-Object -ExpandProperty Service
if ($serviceEndpoints -notcontains "Microsoft.Storage") {
if ($null -eq $serviceEndpoints) {
$serviceEndpoints = @("Microsoft.Storage")
} elseif ($serviceEndpoints -is [string]) {
$serviceEndpoints = @($serviceEndpoints, "Microsoft.Storage")
} else {
$serviceEndpoints += "Microsoft.Storage"
}
$virtualNetwork = $virtualNetwork | Set-AzVirtualNetworkSubnetConfig `
-Name $subnetName `
-AddressPrefix $subnet.AddressPrefix `
-ServiceEndpoint $serviceEndpoints `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Set-AzVirtualNetwork `
-ErrorAction Stop
}
限制儲存體帳戶流量的最後一個步驟是建立網路規則,並將其新增至儲存體帳戶的網路規則集。
$networkRule = $storageAccount | Add-AzStorageAccountNetworkRule `
-VirtualNetworkResourceId $subnet.Id `
-ErrorAction Stop
$storageAccount | Update-AzStorageAccountNetworkRuleSet `
-DefaultAction Deny `
-Bypass AzureServices `
-VirtualNetworkRule $networkRule `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Out-Null
若要使用服務端點來將儲存體帳戶的公用端點存取限制為特定虛擬網路,我們必須先收集儲存體帳戶和虛擬網路的相關資訊。 填入 <storage-account-resource-group>、<storage-account-name>、<vnet-resource-group-name>、<vnet-name> 和 <subnet-name> 以收集這些資訊。
storageAccountResourceGroupName="<storage-account-resource-group>"
storageAccountName="<storage-account-name>"
restrictToVirtualNetworkResourceGroupName="<vnet-resource-group-name>"
restrictToVirtualNetworkName="<vnet-name>"
subnetName="<subnet-name>"
storageAccount=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "id" | \
tr -d '"')
virtualNetwork=$(az network vnet show \
--resource-group $restrictToVirtualNetworkResourceGroupName \
--name $restrictToVirtualNetworkName \
--query "id" | \
tr -d '"')
subnet=$(az network vnet subnet show \
--resource-group $restrictToVirtualNetworkResourceGroupName \
--vnet-name $restrictToVirtualNetworkName \
--name $subnetName \
--query "id" | \
tr -d '"')
為了讓 Azure 網路的網狀架構允許來自虛擬網路的流量,進而取得儲存體帳戶公用端點,虛擬網路的子網路必須公開 Microsoft.Storage 服務端點。 下列 CLI 命令會將 Microsoft.Storage 服務端點新增至子網路 (如果尚未新增)。
serviceEndpoints=$(az network vnet subnet show \
--resource-group $restrictToVirtualNetworkResourceGroupName \
--vnet-name $restrictToVirtualNetworkName \
--name $subnetName \
--query "serviceEndpoints[].service" \
--output tsv)
foundStorageServiceEndpoint=false
for serviceEndpoint in $serviceEndpoints
do
if [ $serviceEndpoint = "Microsoft.Storage" ]
then
foundStorageServiceEndpoint=true
fi
done
if [ $foundStorageServiceEndpoint = false ]
then
serviceEndpointList=""
for serviceEndpoint in $serviceEndpoints
do
serviceEndpointList+=$serviceEndpoint
serviceEndpointList+=" "
done
serviceEndpointList+="Microsoft.Storage"
az network vnet subnet update \
--ids $subnet \
--service-endpoints $serviceEndpointList \
--output none
fi
限制儲存體帳戶流量的最後一個步驟是建立網路規則,並將其新增至儲存體帳戶的網路規則集。
az storage account network-rule add \
--resource-group $storageAccountResourceGroupName \
--account-name $storageAccountName \
--subnet $subnet \
--output none
az storage account update \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--bypass "AzureServices" \
--default-action "Deny" \
--output none
另請參閱