Microsoftの公式告知によると、2025/9/30にパブリックIPの Basic が廃止になります。
On 30 September 2025, Basic SKU public IP addresses will be retired in Azure.
https://azure.microsoft.com/ja-jp/updates?id=upgrade-to-standard-sku-public-ip-addresses-in-azure-by-30-september-2025-basic-sku-will-be-retired
basicを利用してる場合にはStandardに変更が必要なので、今回はその手順を試してみました。
なお、パブリックIPのアドレスは変更せずに、SKU変更が可能です。
事前準備
AzurePowershellが必要になるので以下の記事も参考にしつつインストールしてください。
なお、Azureへのログインとサブスクリプションの変更コマンドは以下です。
# Azureへログイン
Connect-AzAccount
# サブスクリプションの変更
Set-AzContext -Subscription "<サブスクリプション名>"
1.可用性セットに所属していない単一の仮想マシンを変更
以下の公式ドキュメントの手順を参考にやってみます。

1-1. 移行前の状態確認
事前にパブリックIPの状態を確認します。
$rg_name = "rg-test-ip-migre" ##<VMが所属するRGの名前>
$pip_name = "pip-vm-standalone-001-ip" ##<パブリックIPアドレスの名前>
$info = Get-AzPublicIpAddress -ResourceGroupName $rg_name -Name $pip_name
$info.Ipaddress
$info.SkuText
以下のように出力されるのでIPアドレスとSKUを確認します。
変更前なので、SKUが basic であることが確認できます。
PS C:\> $info.Ipaddress
52.185.131.213
PS C:\>
PS C:\> $info.SkuText
{
"Name": "Basic",
"Tier": "Regional"
}
PS C:\>
1-2. スクリプトのダウンロード
以下のコマンドを実行して移行用スクリプトをダウンロードします。
# スタンドアロンのVM用移行スクリプト
Install-Module -Name AzureVMPublicIPUpgrade -Scope CurrentUser -Repository PSGallery -Force
以下のように警告が表示される可能性もありますが、この出力が出ていてもこの後のコマンドは実行できるため、無視して問題ありません。
PS C:\> Install-Module -Name AzureVMPublicIPUpgrade -Scope CurrentUser -Repository PSGallery -Force
警告: バージョン '4.0.2' のモジュール 'Az.Accounts'
は現在使用中です。アプリケーションを終了した後で、操作をやり直してください。
警告: バージョン '7.14.0' のモジュール 'Az.Network'
は現在使用中です。アプリケーションを終了した後で、操作をやり直してください。
PS C:\>
おそらく、Az.Accountsはログイン操作で、Az.Networkは事前の状態確認の際に利用されているために出力されているのだと思いますが、同じpowershellのセッションでの利用なので問題がないのだと推測されます。
1-3. 移行可能かの事前確認
設定変更が可能かを事前確認できます。
本番のコマンドを実行した際にエラーが出ると仮想マシンに影響が出る可能性があるため、なるべく実行したほうが良いかと思います。
$rg_name = "rg-test-ip-migre" ##<VMが所属するRGの名前>
$vm_name = "vm-standalone-001" ##<VMの名前>
# 事前確認
Start-VMPublicIPUpgrade -VMName $vm_name -ResourceGroupName $rg_name -WhatIf
以下のような出力になり、最後の行で「Upgrade process complete.」と表示されていればOKです。
PS C:\> Start-VMPublicIPUpgrade -VMName $vm_name -ResourceGroupName $rg_name -WhatIf
[2025-02-21T14:38:36+09][INFO] ####### Starting VM Public IP Upgrade process... #######
[2025-02-21T14:38:36+09][INFO] Creating recovery log file at 'PublicIPUpgrade_Recovery_2025-02-21-14-38.csv'
[2025-02-21T14:38:36+09][INFO] Getting VM 'vm-standalone-001' in resource group 'rg-test-ip-migre'...
~~~中略~~~
[2025-02-21T14:38:40+09][INFO] Applying updates to the NIC 'vm-standalone-001813'...
[2025-02-21T14:38:40+09][INFO] WhatIf: Updating NIC with: $nic | Set-AzNetworkIntereface
[2025-02-21T14:38:40+09][INFO] Upgrade of VM 'vm-standalone-001' complete.'
[2025-02-21T14:38:40+09][INFO] ####### Upgrade process complete. #######
PS C:\>
[エラーが出た場合] このモジュールを読み込むことができませんでした。
事前確認のコマンド実行時に、「このモジュールを読み込むことができませんでした。」というようなエラーが出ることもあります。
エラーの内容を確認して対応をするのが第一ですが、私の場合にはAzとAzureRMというモジュールが競合を起こしていてエラーとなっていました。
その場合にはAzureRMをアンインストールする必要があるので以下の記事を参考にしてアンインストールしてください。
1-4. 移行実行
事前確認で「Upgrade process complete.」が表示されたことを確認したら本番のコマンドを実行します。
Start-VMPublicIPUpgrade -VMName $vm_name -ResourceGroupName $rg_name
基本的には事前確認コマンド実行時と同じ出力になります。
また、最初に本当に実行しても良いかを聞かれるので確認し、 y を入力して実行してください。
PS C:\> Start-VMPublicIPUpgrade -VMName $vm_name -ResourceGroupName $rg_name
[2025-02-21T14:46:27+09][INFO] ####### Starting VM Public IP Upgrade process... #######
This script will upgrade all public IP addresses attached to the specified VM or VMs to Standard SKU. This will cause a brief interruption to network connectivity. Do you want to continue? (y/n): y
[2025-02-21T14:46:42+09][INFO] Continuing with script...
~~~中略~~~
[2025-02-21T14:48:31+09][INFO] Upgrade of VM 'vm-standalone-001' complete.'
[2025-02-21T14:48:31+09][INFO] ####### Upgrade process complete. #######
PS C:\>
Upgrade process complete. と表示されたら完了です。
1-5. 移行後の状態確認
移行が正常に完了したかどうかを、事前確認と同じコマンドで確認します。
$rg_name = "rg-test-ip-migre" ##<VMが所属するRGの名前>
$pip_name = "pip-vm-standalone-001-ip" ##<パブリックIPアドレスの名前>
$info = Get-AzPublicIpAddress -ResourceGroupName $rg_name -Name $pip_name
$info.Ipaddress
$info.SkuText
実行結果
PS C:\> $info.Ipaddress
52.185.131.213
PS C:\> $info.SkuText
{
"Name": "Standard",
"Tier": "Regional"
}
PS C:\>
IPアドレスは変更されず、SKUが Standardに 変更されたことが確認できました。
これで移行完了です。
なお、かかった時間としては、コマンド後実行してから5分かからずに完了しました。
2.可用性セットに所属している仮想マシン1台を変更
こちらも、以下の公式ドキュメントの手順を参考にやってみました。

2-1. 移行前の状態確認
事前にパブリックIPの状態と仮想マシンに可用性セットが設定されていることを確認します。
$rg_name = "rg-test-ip-migre" ##<VMが所属するRGの名前>
$vm_name = "vm-avail-001" ##<VMの名前>
$pip_name = "pip-vm-avail-001-ip" ##<パブリックIPアドレスの名前>
# パブリックIPの状態確認
$info = Get-AzPublicIpAddress -ResourceGroupName $rg_name -Name $pip_name
$info.Ipaddress
$info.SkuText
# 仮想マシンの可用性セットを確認
$info_vm = Get-AzVM -ResourceGroupName $rg_name -Name $vm_name
$split = $info_vm.AvailabilitySetReference.Id -split "/"
$split[8..$split.Length] -join "/"
以下のように出力されるのでIPアドレスとSKUを確認します。
変更前なのでSKUが basic であることが確認できます。
また仮想マシンにも 可用性セット(avail-001)が設定されていることを確認できます。
PS C:\> # パブリックIPの状態確認
PS C:\> $info = Get-AzPublicIpAddress -ResourceGroupName $rg_name -Name $pip_name
PS C:\> $info.Ipaddress
52.185.136.191
PS C:\> $info.SkuText
{
"Name": "Basic",
"Tier": "Regional"
}
PS C:\>
PS C:\> # 仮想マシンの可用性セットを確認
PS C:\> $info_vm = Get-AzVM -ResourceGroupName $rg_name -Name $vm_name
PS C:\> $split = $info_vm.AvailabilitySetReference.Id -split "/"
PS C:\> $split[8..$split.Length] -join "/"
AVAIL-001
2-2. スクリプトのダウンロード
以下のコマンドを実行して移行用スクリプトをダウンロードします。
# 可用性セットに所属しているVM用移行スクリプト
Install-Module -Name AzureAvSetBasicPublicIPUpgrade -Scope CurrentUser -Repository PSGallery -Force
以下のように警告が表示される可能性もありますが、この出力が出ていてもこの後のコマンドは実行できるため、無視して問題ありません。
PS C:\> Install-Module -Name AzureAvSetBasicPublicIPUpgrade -Scope CurrentUser -Repository PSGallery -Force
警告: バージョン '4.0.2' のモジュール 'Az.Accounts'
は現在使用中です。アプリケーションを終了した後で、操作をやり直してください。
警告: バージョン '9.1.0' のモジュール 'Az.Compute'
は現在使用中です。アプリケーションを終了した後で、操作をやり直してください。
警告: バージョン '7.14.0' のモジュール 'Az.Network'
は現在使用中です。アプリケーションを終了した後で、操作をやり直してください。
PS C:\>
おそらく、Az.Accountsはログイン操作で、Az.ComputeとAz.Networkは事前の状態確認の際に利用されているために出力されているのだと思いますが、同じpowershellのセッションでの利用なので問題がないのだと推測されます。
2-3. 移行可能かの事前確認
設定変更が可能かを事前確認できます。
本番のコマンドを実行した際にエラーが出ると仮想マシンに影響が出る可能性があるため、なるべく実行したほうが良いかと思います。
$avail_name = "avail-001"
# 事前確認
Start-AzAvSetPublicIPUpgrade -availabilitySetName $avail_name -resourceGroupName $rg_name -WhatIf
以下のような出力になり、最後の行で「Upgrade process complete.」と表示されていればOKです。
PS C:\> Start-AzAvSetPublicIPUpgrade -availabilitySetName $avail_name -resourceGroupName $rg_name -WhatIf
[2025-02-21T15:33:00+09][INFO] ####### Starting Availability Set Public IP Upgrade validation process #######
[2025-02-21T15:33:00+09][INFO] Creating recovery log file at 'AvSetPublicIPUpgrade_Recovery_2025-02-21-15-33.csv'
[2025-02-21T15:33:00+09][INFO] Getting Availability Set 'avail-001' in resource group 'rg-test-ip-migre'...
~~~中略~~~
[2025-02-21T15:33:04+09][INFO] Applying updates to the NIC 'vm-avail-001201'...
[2025-02-21T15:33:04+09][INFO] WhatIf: Updating NIC with: $nic | Set-AzNetworkIntereface
[2025-02-21T15:33:04+09][INFO] Upgrade of VM 'vm-avail-001' complete.'
[2025-02-21T15:33:04+09][INFO] Upgrade of Availability Set 'avail-001' complete.'
[2025-02-21T15:33:04+09][INFO] ####### Upgrade process complete. #######
PS C:\>
2-4. 移行実行
事前確認で「Upgrade process complete.」が表示されたことを確認したら本番のコマンドを実行します。
Start-AzAvSetPublicIPUpgrade -availabilitySetName $avail_name -resourceGroupName $rg_name
基本的には事前確認コマンド実行時と同じ出力になります。
また、最初に本当に実行しても良いかを聞かれるので確認し、 y を入力して実行してください。
PS C:\> Start-AzAvSetPublicIPUpgrade -availabilitySetName $avail_name -resourceGroupName $rg_name
[2025-02-21T15:37:57+09][INFO] ####### Starting Availability Set Public IP Upgrade validation process #######
This script will upgrade all public IP addresses attached to all VMs in the specificed Availability Set(s) to Standard SKU. This will cause a brief interruption to network connectivity. Do you want to continue? (y/n): y
[2025-02-21T15:37:59+09][INFO] Continuing with script...
[2025-02-21T15:37:59+09][INFO] Creating recovery log file at 'AvSetPublicIPUpgrade_Recovery_2025-02-21-15-37.csv'
[2025-02-21T15:37:59+09][INFO] Getting Availability Set 'avail-001' in resource group 'rg-test-ip-migre'...
~~~中略~~~
[2025-02-21T15:38:35+09][INFO] Applying updates to the NIC 'vm-avail-001201'...
[2025-02-21T15:39:18+09][INFO] Upgrade of VM 'vm-avail-001' complete.'
[2025-02-21T15:39:18+09][INFO] Upgrade of Availability Set 'avail-001' complete.'
[2025-02-21T15:39:18+09][INFO] ####### Upgrade process complete. #######
PS C:\>
Upgrade process complete. と表示されたら完了です。
2-5. 移行後の状態確認
移行が正常に完了したかどうかを、事前確認と同じコマンドで確認します。
# パブリックIPの状態確認
$info = Get-AzPublicIpAddress -ResourceGroupName $rg_name -Name $pip_name
$info.Ipaddress
$info.SkuText
# 仮想マシンの可用性セットを確認
$info_vm = Get-AzVM -ResourceGroupName $rg_name -Name $vm_name
$split = $info_vm.AvailabilitySetReference.Id -split "/"
$split[8..$split.Length] -join "/"
実行結果
PS C:\> # パブリックIPの状態確認
PS C:\> $info = Get-AzPublicIpAddress -ResourceGroupName $rg_name -Name $pip_name
PS C:\> $info.Ipaddress
52.185.136.191
PS C:\> $info.SkuText
{
"Name": "Standard",
"Tier": "Regional"
}
PS C:\>
PS C:\> # 仮想マシンの可用性セットを確認
PS C:\> $info_vm = Get-AzVM -ResourceGroupName $rg_name -Name $vm_name
PS C:\> $split = $info_vm.AvailabilitySetReference.Id -split "/"
PS C:\> $split[8..$split.Length] -join "/"
AVAIL-001
IPアドレスは変更されず、SKUが Standardに 変更されたことが確認できました。
また、仮想マシンも移行前と同じ可用性セットが設定されていることも確認できました。
これで移行完了です。
なお、こちらも、コマンド後実行してから5分かからずに完了しました。
3.可用性セットに所属している仮想マシン複数台を変更
基本的には2.可用性セットに所属している仮想マシン1台を変更と同じ手順で実施します。
ここでは、複数VMが可用性セット名にあるときに全ての仮想マシンで移行が完了するかを確認していきます。
今回は1つの可用性セットに3台仮想マシンがある構成で確認します。
3-1. 事前の状態確認
事前確認として各仮想マシンのパブリックIPの情報と可用性セットが同じリソースであるかを確認します。
$rg_name = "rg-test-ip-migre"
$pip_names = @("pip-vm-avail-multi-001-ip", "pip-vm-avail-multi-002-ip", "pip-vm-avail-multi-003-ip")
$vm_names = @("vm-avail-multi-001", "vm-avail-multi-002", "vm-avail-multi-003")
# パブリックIPの状態確認
foreach ($pip_name in $pip_names) {
$info = Get-AzPublicIpAddress -ResourceGroupName $rg_name -Name $pip_name
Write-Output "$pip_name : $($info.IpAddress) SKU: $($info.SkuText)"
}
# 仮想マシンの可用性セットを確認
foreach ($vm_name in $vm_names) {
$info_vm = Get-AzVM -ResourceGroupName $rg_name -Name $vm_name
$split = $info_vm.AvailabilitySetReference.Id -split "/"
Write-Output "VM Name: $($vm_name) Availability Set: $($split[8..$split.Length] -join "/")"
}
実行結果
パブリックIPのアドレスとそのSKU(basic)、そしてすべて同じ可用性セット(AVAIL-MULTI-001)に所属していることが確認できます。
PS C:\> # パブリックIPの状態確認
PS C:\> foreach ($pip_name in $pip_names) {
>> $info = Get-AzPublicIpAddress -ResourceGroupName $rg_name -Name $pip_name
>> Write-Output "$pip_name : $($info.IpAddress) SKU: $($info.SkuText)"
>> }
pip-vm-avail-multi-001-ip : 20.222.108.177 SKU: {
"Name": "Basic",
"Tier": "Regional"
}
pip-vm-avail-multi-002-ip : 48.210.12.77 SKU: {
"Name": "Basic",
"Tier": "Regional"
}
pip-vm-avail-multi-003-ip : 48.210.14.146 SKU: {
"Name": "Basic",
"Tier": "Regional"
}
PS C:\>
PS C:\> # 仮想マシンの可用性セットを確認
PS C:\> foreach ($vm_name in $vm_names) {
>> $info_vm = Get-AzVM -ResourceGroupName $rg_name -Name $vm_name
>> $split = $info_vm.AvailabilitySetReference.Id -split "/"
>> Write-Output "VM Name: $($vm_name) Availability Set: $($split[8..$split.Length] -join "/")"
>> }
VM Name: vm-avail-multi-001 Availability Set: AVAIL-MULTI-001
VM Name: vm-avail-multi-002 Availability Set: AVAIL-MULTI-001
VM Name: vm-avail-multi-003 Availability Set: AVAIL-MULTI-001
PS C:\>
3-2. スクリプトダウンロードと事前の確認
移行用スクリプトのモジュールをインストールし、事前確認を実施します。
$avail_name = "avail-multi-001"
# 可用性セットに所属しているVM用移行スクリプト
Install-Module -Name AzureAvSetBasicPublicIPUpgrade -Scope CurrentUser -Repository PSGallery -Force
# 事前確認
Start-AzAvSetPublicIPUpgrade -availabilitySetName $avail_name -resourceGroupName $rg_name -WhatIf
3-3. 移行実行
移行コマンドを実行します。
Start-AzAvSetPublicIPUpgrade -availabilitySetName $avail_name -resourceGroupName $rg_name
Upgrade process complete. と表示されたら完了です。
3-4. 移行後の状態確認
移行が正常に完了したかどうかを、事前確認と同じコマンドで確認します。
差分としてはパブリックIPアドレスのSKUが Standard に変わっている箇所のみです。
アドレス自体は変更なく、可用性セットも設定変更前と同じ可用性セットが設定されています。
PS C:\> $rg_name = "rg-test-ip-migre"
PS C:\> $pip_names = @("pip-vm-avail-multi-001-ip", "pip-vm-avail-multi-002-ip", "pip-vm-avail-multi-003-ip")
PS C:\> $vm_names = @("vm-avail-multi-001", "vm-avail-multi-002", "vm-avail-multi-003")
PS C:\>
PS C:\> # パブリックIPの状態確認
PS C:\> foreach ($pip_name in $pip_names) {
>> $info = Get-AzPublicIpAddress -ResourceGroupName $rg_name -Name $pip_name
>> Write-Output "$pip_name : $($info.IpAddress) SKU: $($info.SkuText)"
>> }
pip-vm-avail-multi-001-ip : 20.222.108.177 SKU: {
"Name": "Standard",
"Tier": "Regional"
}
pip-vm-avail-multi-002-ip : 48.210.12.77 SKU: {
"Name": "Standard",
"Tier": "Regional"
}
pip-vm-avail-multi-003-ip : 48.210.14.146 SKU: {
"Name": "Standard",
"Tier": "Regional"
}
PS C:\>
PS C:\> # 仮想マシンの可用性セットを確認
PS C:\> foreach ($vm_name in $vm_names) {
>> $info_vm = Get-AzVM -ResourceGroupName $rg_name -Name $vm_name
>> $split = $info_vm.AvailabilitySetReference.Id -split "/"
>> Write-Output "VM Name: $($vm_name) Availability Set: $($split[8..$split.Length] -join "/")"
>> }
VM Name: vm-avail-multi-001 Availability Set: AVAIL-MULTI-001
VM Name: vm-avail-multi-002 Availability Set: AVAIL-MULTI-001
VM Name: vm-avail-multi-003 Availability Set: AVAIL-MULTI-001
PS C:\>
可用性セットに複数台仮想マシンが構成されていても、すべてのパブリックIPのSKUを正常に変更することができました。