將連結至 VM 的公用 IP 位址從基本升級為標準

重要

於 2025 年 9 月 30 日,基本 SKU 公用 IP 將會淘汰。 如需詳細資訊,請參閱官方公告。 如果您目前使用基本 SKU 公用 IP,請務必在淘汰日期之前升級至標準 SKU 公用 IP。 本文將協助您完成升級流程。

如需淘汰基本 SKU 公用 IP 和標準 SKU 公用 IP 權益的詳細資訊,請參閱這裡

升級概觀

此指令碼會將連結至 VM 的任何公用 IP 位址從基本升級為標準 SKU。 為了執行升級,公用 IP 位址配置方法會先設定為靜態,再與 VM 解除關聯。 解除關聯之後,公用 IP SKU 會升級為標準,然後 IP 會與 VM 重新建立關聯。

由於公用 IP 配置在從 VM 中斷連結之前設定為「靜態」,因此即使發生指令碼失敗,IP 位址也不會在升級程序期間變更。 模組會先仔細檢查公用 IP 配置方法是否為「靜態」,再將公用 IP 與 VM 中斷連結。

模組會將所有升級活動記錄到名為 PublicIPUpgrade.log 的檔案,於執行模組的相同位置建立 (預設)。

限制/不支援的案例

  • 具有與 Load Balancer 相關聯 NIC 的 VM:因為與 VM 相關聯的 Load Balancer 和公用 IP SKU 必須相符,因此,當 VM 的 NIC 也透過後端集區或 NAT 集區成員資格建立關聯時,就無法升級與 VM 相關聯的執行個體層級公用 IP 位址。 使用指令碼將基本負載平衡器升級至標準 SKU,以同時升級負載平衡器和公用 IP。

  • 沒有網路安全性群組的 VM:具有要升級 IP 的 VM 必須有與具有公用 IP 或直接使用 NIC 的每個 IP 設定子網路相關聯的網路安全性群組 (NSG)。 這是因為標準 SKU 公用 IP「預設為安全」,這表示必須在 NSG 明確允許連線到 VM 的任何公用 IP 流量。 基本 SKU 公用 IP 預設會允許任何流量。 升級沒有 NSG 的公用 IP SKU 會導致在移轉後封鎖基本 SKU 時,將輸入網際網路流量傳送到先前允許的公用 IP。 請參閱:公用 IP SKU

  • 虛擬機器擴展集搭配公用 IP 設定:如果您有虛擬機器擴展集 (統一模型) 搭配每個執行個體一個公用 IP 設定,則請注意,這些設定不是公用 IP 資源,因此無法升級。 相反地,您可以移除基本 IP 設定,並使用 SKU 屬性來指定每個虛擬機器擴展集執行個體都需要標準 IP 設定,如這裡所示。

必要條件

下載指令碼

PowerShell 資源庫下載移轉指令碼。

PS C:\> Install-Module -Name AzureVMPublicIPUpgrade -Scope CurrentUser -Repository PSGallery -Force

使用模組

  1. 使用 Connect-AzAccount 以連線到必要的 Microsoft Entra 租用戶和 Azure 訂用帳戶

    PS C:\> Connect-AzAccount -Tenant <TenantId> -Subscription <SubscriptionId>
    
  2. 找出具有要升級的連結基本公用 IP 的 VM。 記錄其名稱和資源群組名稱。

  3. 檢查模組參數:

    • VMName [string] 必要 - 此參數是您 VM 的名稱。
    • ResourceGroupName [string] 必要 - 此參數是 VM 的資源群組,其中包含您要升級的基本公用 IP。
  4. 執行升級命令。

指令碼的範例用法

若要升級單一 VM,請將 VM 名稱和資源群組名稱以參數形式傳遞。

    Start-VMPublicIPUpgrade -VMName 'myVM' -ResourceGroupName 'myRG'

若要評估升級單一 VM 而不進行任何變更,請新增 -WhatIf 參數。

    Start-VMPublicIPUpgrade -VMName 'myVM' -ResourceGroupName 'myRG' -WhatIf

若要升級資源群組中的所有 VM,請略過沒有網路安全性群組的 VM。

    Get-AzVM -ResourceGroupName 'myRG' | Start-VMPublicIPUpgrade -skipVMMissingNSG

從失敗的移轉復原

如果移轉因為暫時性問題而失敗,例如網路中斷或用戶端系統問題,則可以重新執行移轉,以設定 VM 和公用 IP 成為目標狀態。 在執行時,指令碼會輸出復原記錄檔,用來確保 VM 已正確重新設定。 檢閱在執行指令碼所在的位置中建立的記錄檔 PublicIPUpgrade.log

若要從失敗的升級復原,請使用 -recoverFromFile 參數將復原記錄檔路徑傳遞至指令碼,並識別要使用 -VMName-VMResourceGroup-VMResourceID 參數復原的 VM,如本範例所示。

    Start-VMPublicIPUpgrade -RecoverFromFile ./PublicIPUpgrade_Recovery_2020-01-01-00-00.csv -VMName myVM -VMResourceGroup -rg-myrg

常見問題

移轉需要多久的時間,以及我的 VM 在使用其公用 IP 時無法存取多久的時間?

升級 VM 的公用 IP 所需的時間取決於與 VM 相關聯的公用 IP 和網路介面數目。 在測試中,具有單一 NIC 和公用 IP 的 VM需要 1 到 2 分鐘才能升級。 VM 上的每個 NIC 都會再增加大約一分鐘,且每個公用 IP 會各增加幾秒。

我可以復原至基本 SKU 公用 IP 嗎?

無法將公用 IP 位址從標準降級為基本。

我可以在執行之前先測試移轉嗎?

若未完成動作,就無法評估升級公用 IP。 不過,此指令碼包含 -whatif 參數,它會檢查您的 VM 是否將支援升級,並逐步執行步驟而不採取動作。

指令碼是否支援區域性基本 SKU 公用 IP?

是,將區域性基本 SKU 公用 IP 升級至區域性標準 SKU 公用 IP 的程序完全相同,而且可在指令碼中運作。

使用 Resource Graph 來列出具有需要升級的公用 IP 的 VM

查詢以列出具有基本 SKU 公用 IP 位址的虛擬機器

此查詢會傳回已連結基本 SKU 公用 IP 位址的虛擬機器識別碼的清單。

Resources
| where type =~ 'microsoft.compute/virtualmachines'
| project vmId = tolower(id), vmNics = properties.networkProfile.networkInterfaces
| join (
  Resources |
  where type =~ 'microsoft.network/networkinterfaces' |
  project nicVMId = tolower(tostring(properties.virtualMachine.id)), allVMNicID = tolower(id), nicIPConfigs = properties.ipConfigurations)
  on $left.vmId == $right.nicVMId
| join (
  Resources
  | where type =~ 'microsoft.network/publicipaddresses' and isnotnull(properties.ipConfiguration.id)
  | where sku.name == 'Basic' // exclude to find all VMs with Public IPs
  | project pipId = id, pipSku = sku.name, pipAssociatedNicId = tolower(tostring(split(properties.ipConfiguration.id, '/ipConfigurations/')[0])))
  on $left.allVMNicID == $right.pipAssociatedNicId
| project vmId, pipId, pipSku
az graph query -q "Resources | where type =~ 'microsoft.compute/virtualmachines' | project vmId = tolower(id), vmNics = properties.networkProfile.networkInterfaces | join (Resources | where type =~ 'microsoft.network/networkinterfaces' | project nicVMId = tolower(tostring(properties.virtualMachine.id)), allVMNicID = tolower(id), nicIPConfigs = properties.ipConfigurations) on \$left.vmId == \$right.nicVMId | join ( Resources | where type =~ 'microsoft.network/publicipaddresses' and isnotnull(properties.ipConfiguration.id) | where sku.name == 'Basic' | project pipId = id, pipSku = sku.name, pipAssociatedNicId = tolower(tostring(split(properties.ipConfiguration.id, '/ipConfigurations/')[0]))) on \$left.allVMNicID == \$right.pipAssociatedNicId | project vmId, pipId, pipSku"

下一步