Web App 存取 VNet 內的資源

在 Azure 中,這項功能稱為 「輸出 VNet 整合」(Outbound VNet Integration)。它能讓你的 Web App 存取 VNet 內的資源(例如私有的資料庫或 VM),而不需要經過公網。

不過,要成功將 Web App 加入 VNet,你需要注意以下幾個關鍵點:

1. 方案等級限制 (App Service Plan SKU)

並非所有的 Web App 都能加入 VNet。你的 App Service Plan 必須是以下等級之一:

  • Basic (僅限較新的版本)
  • Standard
  • Premium (v2 或 v3)
  • Functions Premium

如果你是 FreeShared 等級,則不支援 VNet 整合。


2. 子網段 (Subnet) 的特殊要求

Web App 加入 VNet 不是隨便找個 Subnet 塞進去就好,它有「潔癖」:

  • 必須是空的:該 Subnet 不能有其他資源(如 VM 或資料庫)。
  • 必須委派 (Delegation):該 Subnet 必須專門「委派」給 Microsoft.Web/serverFarms 使用。
  • 足夠的 IP:建議至少保留 /28 位址空間(16 個 IP),因為 Web App 擴展時會消耗 IP。

3. 如何執行?(PowerShell 指令)

既然你已經定義了變數,以下是將 Web App 整合進 VNet 的標準流程:

A. 先幫 Subnet 設定委派 (如果還沒設定)

PowerShell

# 取得現有的 VNet 物件並設定 Subnet 委派
$vnet = Get-AzVirtualNetwork -Name $VNET_NAME -ResourceGroupName $RESOURCE_GROUP
$subnet = $vnet.Subnets | Where-Object { $_.Name -eq $SUBNET_NAME }

# 執行委派 (Delegation)
az network vnet subnet update `
  --resource-group $RESOURCE_GROUP `
  --vnet-name $VNET_NAME `
  --name $SUBNET_NAME `
  --delegations Microsoft.Web/serverFarms

B. 執行 VNet 整合

PowerShell

az webapp vnet-integration add `
  --resource-group $RESOURCE_GROUP `
  --name $WEB_APP_NAME `
  --vnet $VNET_NAME `
  --subnet $SUBNET_NAME

4. 常見的坑(鬼打牆預警)

  • 區域限制 (Region):Web App 和 VNet 最好在同一個 Region(你的變數看起來都是 jpe 日本東部,這沒問題)。
  • 路由問題:預設情況下,只有往 VNet 私有位址的流量會走 VNet。如果你希望連「上網」的流量都強迫走 VNet(例如要過防火牆),你需要開啟 Route All 設定。

我目前的 RG 可以加入其他 RG 的 vnet

在 Azure 中,資源的「實體連線」(VNet 整合)與「邏輯分類」(Resource Group, RG)是解耦的。只要你的帳號在兩個 Resource Group 都擁有足夠的權限(通常是 ContributorNetwork Contributor),就能跨組進行整合。

以下是跨 RG 加入 VNet 的操作要點與指令:


1. 核心邏輯:使用「資源 ID」

當 VNet 在另一個 RG 時,單純傳入 VNet 名稱 $VNET_NAME 可能會讓 CLI 找不到對象。最穩健的做法是使用 完整資源 ID (Resource ID)

2. 指令實作

首先,定義 VNet 所在的 RG 名稱(假設叫 rg-network-shared):

PowerShell

# 設定 VNet 所在的資源群組
$VNET_RG = "rg-network-shared" # 請換成你 VNet 實際所在的 RG 名稱

# 1. 取得 VNet 的子網段資源 ID (最保險的做法)
$SUBNET_ID = "/subscriptions/你的訂閱ID/resourceGroups/$VNET_RG/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME"

# 2. 執行 VNet 整合
az webapp vnet-integration add `
  --name $WEB_APP_NAME `
  --resource-group $RESOURCE_GROUP `
  --vnet $VNET_NAME `
  --subnet $SUBNET_NAME `
  --subscription "你的訂閱ID" # 如果跨訂閱才需要,同訂閱可省略

3. 關鍵權限檢查(鬼打牆預防)

由於你提到你「目前不是 Owner」,跨 RG 操作最常卡在 RBAC 權限

  • 你的 RG ($RESOURCE_GROUP):你需要有權限修改 Web App(Contributor)。
  • VNet 的 RG ($VNET_RG):你必須至少擁有該 Subnet 的 「Microsoft.Network/virtualNetworks/subnets/join/action」 權限。
    白話文:如果你在 VNet 那邊連讀取權都沒有,這條路會斷掉。

4. 區域 (Region) 依然是死穴

雖然 RG 可以跨,但 Region 幾乎不能跨(除非使用特定進階功能):

  • 你的 Web App 在 Japan East,VNet 也必須在 Japan East
  • 如果 Web App 在 Taiwan North,VNet 也必須在 Taiwan North

5. 總結流程圖

💡 建議操作步驟

  1. 確認區域:先用 az network vnet show --name $VNET_NAME -g $VNET_RG --query location 確認 VNet 的位置。
  2. 設定委派:確保該 Subnet 已經委派給 Microsoft.Web/serverFarms
  3. 執行整合:使用上面的 az webapp vnet-integration add 指令。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *