Azure のパブリック IP を Basic(Dynamic)から Standard(Static)へ切り替えたいのに、ポータルでは PublicIPAddressInUseCannotUpdate などのエラーで進められない——そんな“詰み”に見える状況を根本から解きほぐし、確実に移行するための実践ガイドです。UI の表示揺れ対策、依存関係の洗い出し、PowerShell/CLI の代替手順、ダウンタイム最小化の設計までを一気通貫で解説します。
問題の本質と結論
Basic SKU のパブリック IP を Standard SKU にアップグレードする際の最頻出エラーは、要約すると次の二点です。
- IP が何かに関連付けられている(In Use):VM の NIC、ロードバランサー、Application Gateway、NAT Gateway、Public IP Prefix など、いずれかのリソースが参照中だと SKU 変更は拒否されます(
PublicIPAddressInUseCannotUpdate)。 - 割り当て方法が Dynamic のまま:Standard へは Static が必須。Dynamic → Static に変更済みかつ保存成功が条件です。
正しい順序は「Static に変更 → すべての関連付けを解除 → Standard にアップグレード → 再関連付け」。この流れであれば同一の IP アドレスを維持したまま切り替えられます(ダウングレードは不可)。ポータルが状態を取りこぼす場合は、F5 での再読み込みや CLI/PowerShell による確認が有効です。
用語と動作差の整理
| 観点 | Basic SKU | Standard SKU |
|---|---|---|
| 割り当て | Dynamic / Static | Static のみ(推奨・必須) |
| セキュリティ既定 | 比較的寛容(NSG 無しでも通ってしまう構成がある) | セキュア・デフォルト(NSG で明示許可が必要) |
| 可用性 | ゾーン非対応 | ゾーン/ゾーン冗長に対応 |
| 互換性 | Basic LB 等と整合 | Standard LB/NAT GW 等と整合(SKU クロスは不可) |
| SKU 変更 | → Standard へアップグレード可(In Use で不可) | ← Basic へのダウングレード不可 |
事前チェックリスト(確実に通すための準備)
| チェック項目 | 確認方法 | 合格基準/対応 |
|---|---|---|
| RBAC 権限 | 自身のロールを確認 | Network Contributor 以上 |
| リソースロック | 対象 Public IP の Locks | CanNotDelete などがあれば一時解除 |
| 割り当て方法 | Properties / CLI | Static になっていること |
| 関連付け有無 | Overview の Associated to / 依存リソース確認 | 一旦すべて解除できる計画がある |
| ダウンタイム計画 | メンテナンスウィンドウ確保 | 外部通信断が許容される時間帯を確保 |
| DNS/FQDN | DNS ラベル・外部 DNS の TTL | IP は維持される想定だが、FQDN 利用時は再確認 |
| NSG ルール | NIC/サブネットの NSG | Standard は明示許可が必要、事前に定義 |
最短で解決する標準手順(ポータル)
| 手順 | 操作 | ポイント |
|---|---|---|
| ① Static に変更 | Public IP → Configuration → Static を選択し Save | 通知トーストで「保存成功」を確認。表示が変わらない場合は F5。 |
| ② 関連付け解除 | Public IP の Overview → Dissociate | この瞬間、外部からの通信は切れます。ロックがあれば解除。 |
| ③ Standard へアップグレード | Upgrade to Standard SKU → 確認チェック → Yes | 数秒で完了。同一 IP が保持されます(ダウングレード不可)。 |
| ④ 再関連付け | Associate → 種別 Network interface → 対象 NIC を選択 | 通信が復帰。NSG の許可ルールを必ず確認。 |
※ ロードバランサーや Application Gateway で使っている場合は、該当リソースの「フロントエンド IP 構成」側で一旦切り離してから同様に実施します。
ポータルがうまくいかない時の代替(Azure CLI / PowerShell)
Azure CLI(推奨・冪等)
# 変数
RG="<ResourceGroupName>"
PIP="<PublicIpName>"
NIC="<NicName>"
IPCONF="<IpConfigName>" # 例: ipconfig1
# 現状確認
az network public-ip show -g $RG -n $PIP --query "{sku:sku.name,alloc:publicIpAllocationMethod,ip:ipAddress,ref:id}" -o table
# 1) Dynamic → Static(必要な場合)
az network public-ip update -g $RG -n $PIP --allocation-method Static
# 2) 関連付け解除(VM NIC の例)
az network nic ip-config update -g $RG --nic-name $NIC -n $IPCONF --public-ip-address ""
# LB や AGW の場合の例(該当するもののみ実施)
# az network lb frontend-ip update -g $RG --lb-name -n --public-ip-address ""
# az network application-gateway frontend-ip update -g $RG --gateway-name -n --public-ip-address ""
# az network nat gateway public-ip remove -g $RG --gateway-name --public-ip-address
# 3) Standard へアップグレード
az network public-ip update -g $RG -n $PIP --sku Standard
# 4) 再関連付け(VM NIC の例)
az network nic ip-config update -g $RG --nic-name $NIC -n $IPCONF --public-ip-address $PIP
# 5) 検証
az network public-ip show -g $RG -n $PIP --query "{sku:sku.name,alloc:publicIpAllocationMethod,ip:ipAddress,provisioning:provisioningState}" -o table
PowerShell(ポータル失敗時の切り札)
# 必要に応じて Az モジュールを更新
# Install-Module Az -Scope CurrentUser -Force
$rg = ""
$pipName = ""
# 1) Dynamic → Static(必要な場合)
$pip = Get-AzPublicIpAddress -ResourceGroupName $rg -Name $pipName
if ($pip.PublicIpAllocationMethod -ne "Static") {
$pip.PublicIpAllocationMethod = "Static"
$pip | Set-AzPublicIpAddress
}
# 2) すべての関連付けが外れていることを前提に 3) へ
$pip = Get-AzPublicIpAddress -ResourceGroupName $rg -Name $pipName
$pip.Sku.Name = "Standard"
$pip | Set-AzPublicIpAddress # PublicIPAddressInUseCannotUpdate が出るならまだ何かに関連付けられています
「まだ何かに使われています」問題の切り分け
PublicIPAddressInUseCannotUpdate は「どこかで参照されている」サインです。次の順で捜索します。
- Public IP の Overview に表示される Associated to(最初のヒント)。
- VM の NIC → IP configurations → Public IP アドレス欄。
- Load Balancer → Frontend IP configuration(Basic/Standard の SKU 整合にも注意)。
- Application Gateway / Azure Firewall → フロントエンド設定。
- NAT Gateway → 付与済み Public IP の一覧。
- Public IP Prefix(プレフィックス)を使っていないか。
CLI で一括探索するスニペット:
# Basic & Dynamic の Public IP を洗い出し
az network public-ip list --query "[?sku.name=='Basic' && publicIpAllocationMethod=='Dynamic'].{rg:resourceGroup,name:name,id:id,ip:ipAddress}" -o table
# 指定 Public IP を参照する NIC を検索(単純版)
PIP_ID=$(az network public-ip show -g $RG -n $PIP --query id -o tsv)
az network nic list --query "[?ipConfigurations[?publicIpAddress.id=='$PIP_ID']].{rg:resourceGroup,name:name}" -o table
よくあるエラーと対処早見表
| エラー | 原因 | 対処 |
|---|---|---|
PublicIPAddressInUseCannotUpdate | いずれかのリソースが参照中 | すべての関連付けを解除(NIC/LB/AGW/NAT GW など)。 |
| 割り当て方法が Dynamic のまま | Static へ変更未完了/保存未反映 | Static に変更して保存、通知を確認。表示が変わらない時は F5。 |
AuthorizationFailed | 権限不足 | ネットワーク系の更新が可能な RBAC を付与。 |
AnotherOperationInProgress | 並行処理/保留操作あり | 完了を待ち、Activity Log で衝突を確認して再実行。 |
PublicIPAddressSkuCannotBeDowngraded | Standard → Basic を試行 | ダウングレード不可。新規 Basic を別途作成するしかありません。 |
ダウンタイム最小化の設計パターン
パターン A:同一 IP 維持(本記事の手順)
- メリット:外部の許可リストや DNS の再設定が不要。
- デメリット:②~④ の間は通信断。メンテ時間の確保が必須。
パターン B:新規 Standard IP を先行適用して切替(ゼロダウンに近づける)
- 新しい Standard(Static)Public IP を準備。
- NIC/LB に副系としてアタッチ、並行で NSG/ヘルスチェック確認。
- 外部 DNS の TTL を短縮しておき、切替時にレコードを新 IP に更新。
- 安定稼働を確認後、旧 Basic IP を解放(または手順に従いアップグレード)。
デメリット:IP アドレスが変わる。許可リストや対向の修正が必要。
パターン C:フロントにトラフィックマネージャー/Front Door を挟む
フロントのエンドポイントを切り替えることで、背面の Public IP メンテナンスを吸収。大規模/ミッションクリティカル環境向けです。
セキュリティと運用上の注意(Standard ならでは)
- NSG の明示許可が必須:Standard はセキュア既定。Basic では通っていた流入が、Standard 化でブロックされることがあります。インバウンド/アウトバウンド双方を見直してください。
- SKU の整合性:Standard Public IP は Standard Load Balancer と組み合わせます。Basic LB と混在させないでください。
- ゾーン/ゾーン冗長:可用性要件に応じてゾーン指定または冗長を選びます(Public IP 作成時の設定)。
- 課金:Public IP の課金体系は SKU/リージョンで異なります。移行前に見積もりの棚卸しを。
変更後の検証チェックリスト
| 観点 | 検証方法 | 合格基準 |
|---|---|---|
| SKU/割り当て | ポータル Properties / CLI | SKU: Standard, Allocation: Static |
| 到達性 | 疎通テスト(HTTP/TCP/ICMP 等) | 期待するポートで応答あり(NSG ルール許可済み) |
| 依存サービス | 監視/アラート | 外形監視が正常、エラー増加なし |
| DNS/FQDN | 名前解決/証明書 | FQDN が正しく IP を指し証明書は有効 |
# 検証ワンライナー(CLI)
az network public-ip show -g $RG -n $PIP --query "{sku:sku.name,alloc:publicIpAllocationMethod,ip:ipAddress}" -o table
ポータル表示が「Dynamic のまま」問題への対処
- 保存直後は UI が更新されないことがあります。F5 またはリソース再オープンで再読込。
- CLI/PowerShell で実体を確認:
publicIpAllocationMethodがStaticかを確認。 - Activity Log で「Update Public IP Address」が Succeeded になっているかを確認。
- ブラウザ拡張の影響やセッション切れの可能性もあるため、シークレットウィンドウで再実行してみる。
依存関係別:解除・再関連付けの具体例
VM NIC の場合
# 解除
az network nic ip-config update -g $RG --nic-name $NIC -n $IPCONF --public-ip-address ""
# 再関連付け
az network nic ip-config update -g $RG --nic-name $NIC -n $IPCONF --public-ip-address $PIP
Load Balancer(Public フロントエンド)の場合
# 解除(Frontend IP から Public IP を外す)
az network lb frontend-ip update -g $RG --lb-name <LbName> -n <FrontendName> --public-ip-address ""
# 再関連付け
az network lb frontend-ip update -g $RG --lb-name <LbName> -n <FrontendName> --public-ip-address $PIP
Application Gateway の場合
az network application-gateway frontend-ip update -g $RG --gateway-name <AgwName> -n <FrontendName> --public-ip-address $PIP
NAT Gateway の場合
az network nat gateway public-ip remove -g $RG --gateway-name <NatGwName> --public-ip-address $PIP
# 再付与
az network nat gateway public-ip add -g $RG --gateway-name <NatGwName> --public-ip-address $PIP
バッチ変換のための自動化例
CLI:タグベースで一括アップグレード
# タグ upgrade=target の Basic/Dynamic だけを対象にする例
for id in $(az network public-ip list \
--query "[?tags.upgrade=='target' && sku.name=='Basic' && publicIpAllocationMethod=='Dynamic'].id" -o tsv); do
rg=$(az resource show --ids $id --query resourceGroup -o tsv)
name=$(az resource show --ids $id --query name -o tsv)
echo "Processing $name in $rg ..."
# Static 化(冪等)
az network public-ip update -g $rg -n $name --allocation-method Static
# 関連付けが残っているとここで失敗するので、事前に運用側で計画的に切り離しを済ませておく
az network public-ip update -g $rg -n $name --sku Standard
done
PowerShell:確認付きバッチ
$targets = Get-AzPublicIpAddress | Where-Object {
$_.Sku.Name -eq 'Basic' -and $_.PublicIpAllocationMethod -eq 'Dynamic' -and $_.Tag['upgrade'] -eq 'target'
}
foreach ($pip in $targets) {
Write-Host "==> $($pip.Name) in $($pip.ResourceGroupName)"
if ($pip.PublicIpAllocationMethod -ne 'Static') {
$pip.PublicIpAllocationMethod = 'Static'
$pip | Set-AzPublicIpAddress
}
# ここで関連付け解除は個別判断(自動化しづらい)
$pip.Sku.Name = 'Standard'
try {
$pip | Set-AzPublicIpAddress
} catch {
Write-Warning "In use です。解除後に再実行してください:$($pip.Name)"
}
}
ロールバックと安全策
- Standard → Basic の巻き戻しはできません。標準化後に元へ戻す必要がある場合は、新規 Basic IP を作成して置換してください。
- 切替前に NSG/ルーティング/ヘルスプローブを二重化し、即時切り戻し手順を用意しておくと安全です。
- 変更の痕跡は Activity Log で追跡可能。監査要件がある場合は事前にログ保存先(Log Analytics/Storage)を確認。
FAQ
Q. IP アドレスは本当に変わりませんか?
A. 本手順は既存 Public IP リソースの SKU を引き上げるため、同一の IP が維持されます。別リソースに置き換えたり、再作成を伴う場合はアドレスが変わり得ます。
Q. どのくらい停止しますか?
A. ②の解除から ④の再関連付けまでの間は外部から到達できません。実運用では数十秒〜数分が多いですが、ゼロダウンが要件ならパターン B/C を検討してください。
Q. Standard 化したら急に通信できなくなりました。
A. NSG で明示許可が必要です。Basic では通っていた構成でも、Standard ではブロックされることがあります。着信/発信の両方を見直してください。
Q. IPv6 や Zone の設定は変えられますか?
A. SKU 変更はアドレスファミリ(IPv4/IPv6)を跨ぎません。ゾーン特性は作成時の選択に依存します。要件に応じて新規作成+移行も比較してください。
実運用メモ(チェックリスト付き)
- 静的化の保存が成功しているか(通知トースト/CLI で確認)。
- 「関連付けの完全解除」を一括で終えてから SKU 変更を実施。
- NSG の許可ルール(L4/方向/優先度)を事前適用。
- 切替中に管理系アクセスを確保(Bastion/Serial Console など)。
- 変更後の疎通・監視・ログをダブルチェック。
まとめ
Basic(Dynamic)から Standard(Static)へのアップグレードは、順序と依存の扱いさえ正しければ難しい作業ではありません。Static 化 → すべての関連付け解除 → Standard へ変更 → 再関連付けという王道を守り、ポータルの表示揺れには CLI/PowerShell で裏取り。ダウンタイム要件に応じて A/B 切替やフロント分離の戦略も織り交ぜれば、確実かつ安全に標準化を完了できます。
付録:コピペで使える最小スクリプト
CLI 最小版
RG="MyResourceGroup"
PIP="MyPip"
NIC="MyNic"
IPCONF="ipconfig1"
az network public-ip update -g $RG -n $PIP --allocation-method Static
az network nic ip-config update -g $RG --nic-name $NIC -n $IPCONF --public-ip-address ""
az network public-ip update -g $RG -n $PIP --sku Standard
az network nic ip-config update -g $RG --nic-name $NIC -n $IPCONF --public-ip-address $PIP
az network public-ip show -g $RG -n $PIP --query "{sku:sku.name,alloc:publicIpAllocationMethod,ip:ipAddress}" -o table
PowerShell 最小版
$rg = "MyResourceGroup"
$pipName = "MyPip"
$pip = Get-AzPublicIpAddress -ResourceGroupName $rg -Name $pipName
if ($pip.PublicIpAllocationMethod -ne 'Static') {
$pip.PublicIpAllocationMethod = 'Static'
$pip | Set-AzPublicIpAddress
}
# ここで必ず Dissociate 済みであること
$pip = Get-AzPublicIpAddress -ResourceGroupName $rg -Name $pipName
$pip.Sku.Name = 'Standard'
$pip | Set-AzPublicIpAddress
チェック用テーブル(運用手順書に貼れる簡易版)
| 工程 | 目標状態 | 確認方法 | 担当 | 備考 |
|---|---|---|---|---|
| 静的化 | Allocation: Static | Properties / CLI | NW | 通知で保存成功 |
| 関連付け解除 | Associated: None | Overview | NW/OPS | 通信断開始 |
| SKU 変更 | SKU: Standard | Properties / CLI | NW | ダウングレード不可 |
| 再関連付け | 関連付け復帰 | 疎通/監視 | NW/OPS | 通信復帰 |
| NSG 確認 | 明示許可ルール | NSG 設定/ログ | SEC | Standard は明示許可必須 |

コメント