Azure パブリックIPをBasicからStandardへ安全移行する手順|PublicIPAddressInUseCannotUpdateの原因と対処

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 SKUStandard SKU
割り当てDynamic / StaticStatic のみ(推奨・必須)
セキュリティ既定比較的寛容(NSG 無しでも通ってしまう構成がある)セキュア・デフォルト(NSG で明示許可が必要)
可用性ゾーン非対応ゾーン/ゾーン冗長に対応
互換性Basic LB 等と整合Standard LB/NAT GW 等と整合(SKU クロスは不可)
SKU 変更→ Standard へアップグレード可(In Use で不可)← Basic へのダウングレード不可

事前チェックリスト(確実に通すための準備)

チェック項目確認方法合格基準/対応
RBAC 権限自身のロールを確認Network Contributor 以上
リソースロック対象 Public IP の LocksCanNotDelete などがあれば一時解除
割り当て方法Properties / CLIStatic になっていること
関連付け有無Overview の Associated to / 依存リソース確認一旦すべて解除できる計画がある
ダウンタイム計画メンテナンスウィンドウ確保外部通信断が許容される時間帯を確保
DNS/FQDNDNS ラベル・外部 DNS の TTLIP は維持される想定だが、FQDN 利用時は再確認
NSG ルールNIC/サブネットの NSGStandard は明示許可が必要、事前に定義

最短で解決する標準手順(ポータル)

手順操作ポイント
① 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 は「どこかで参照されている」サインです。次の順で捜索します。

  1. Public IP の Overview に表示される Associated to(最初のヒント)。
  2. VM の NIC → IP configurations → Public IP アドレス欄。
  3. Load Balancer → Frontend IP configuration(Basic/Standard の SKU 整合にも注意)。
  4. Application Gateway / Azure Firewall → フロントエンド設定。
  5. NAT Gateway → 付与済み Public IP の一覧。
  6. 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 で衝突を確認して再実行。
PublicIPAddressSkuCannotBeDowngradedStandard → Basic を試行ダウングレード不可。新規 Basic を別途作成するしかありません。

ダウンタイム最小化の設計パターン

パターン A:同一 IP 維持(本記事の手順)

  • メリット:外部の許可リストや DNS の再設定が不要。
  • デメリット:②~④ の間は通信断。メンテ時間の確保が必須。

パターン B:新規 Standard IP を先行適用して切替(ゼロダウンに近づける)

  1. 新しい Standard(Static)Public IP を準備。
  2. NIC/LB に副系としてアタッチ、並行で NSG/ヘルスチェック確認。
  3. 外部 DNS の TTL を短縮しておき、切替時にレコードを新 IP に更新。
  4. 安定稼働を確認後、旧 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 / CLISKU: Standard, Allocation: Static
到達性疎通テスト(HTTP/TCP/ICMP 等)期待するポートで応答あり(NSG ルール許可済み)
依存サービス監視/アラート外形監視が正常、エラー増加なし
DNS/FQDN名前解決/証明書FQDN が正しく IP を指し証明書は有効
# 検証ワンライナー(CLI)
az network public-ip show -g $RG -n $PIP --query &quot;{sku:sku.name,alloc:publicIpAllocationMethod,ip:ipAddress}&quot; -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 &quot;&quot;
# 再関連付け
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 &lt;LbName&gt; -n &lt;FrontendName&gt; --public-ip-address &quot;&quot;
# 再関連付け
az network lb frontend-ip update -g $RG --lb-name &lt;LbName&gt; -n &lt;FrontendName&gt; --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 &lt;NatGwName&gt; --public-ip-address $PIP
# 再付与
az network nat gateway public-ip add    -g $RG --gateway-name &lt;NatGwName&gt; --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 &quot;==&gt; $($pip.Name) in $($pip.ResourceGroupName)&quot;
  if ($pip.PublicIpAllocationMethod -ne 'Static') {
    $pip.PublicIpAllocationMethod = 'Static'
    $pip | Set-AzPublicIpAddress
  }
  # ここで関連付け解除は個別判断(自動化しづらい)
  $pip.Sku.Name = 'Standard'
  try {
    $pip | Set-AzPublicIpAddress
  } catch {
    Write-Warning &quot;In use です。解除後に再実行してください:$($pip.Name)&quot;
  }
}

ロールバックと安全策

  • 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: StaticProperties / CLINW通知で保存成功
関連付け解除Associated: NoneOverviewNW/OPS通信断開始
SKU 変更SKU: StandardProperties / CLINWダウングレード不可
再関連付け関連付け復帰疎通/監視NW/OPS通信復帰
NSG 確認明示許可ルールNSG 設定/ログSECStandard は明示許可必須

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次