AzureのPublic IPのBasic SKUが2025/09/30に廃止されるらしいので移行を試した


tl;dr
--------

要約

- 2025/09/30までにPublic IPのStandard SKUに移行する必要がある
- 2025/03/31以降はPublic IPのBasic SKUは作れなくなる。試行錯誤する場合は注意。 ([ソース](https://learn.microsoft.com/en-us/answers/questions/1025889/action-required-upgrade-from-basic-to-standard-sku.html))
- Basic SKUからStandard SKUへ移行した場合、レベルは「Regional」でゾーンは「ゾーンなし」に相当する。（レベルのGlobalやゾーンを選ぶことはできない。）
- Standard SKUでは静的のみになるため、動的IPは無くなる
- SKUの移行を行う際、Public IPの関連付けを解除しなければならず、解除中はインターネットから繋がらない状態になる
- 作業によるIPの変更は起きない
  - Basic 動的からBasic 静的の切り替え
  - Basic 静的→Standardへの移行（SKUの移行）
  - ただし、Basic 動的のときにVM停止（割り当て解除）すると当然IPが変わるので注意

考えられる影響

- 静的になるため、VMの割り当て解除を行っても、IPを保持するコストがかかるようになる
- Public IPの関連付け解除～関連付けするまでの間、ネットワーク通信ができなくなるor変になる


メールで案内されたアップグレード手順

https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/public-ip-upgrade-portal

背景
--------

`Action required: Upgrade from Basic to Standard SKU public IP addresses in Azure by 30 September 2025` といったメールが届いたので移行を試してみました。メールはサブスクリプション毎に届いていそうで何通か来ていました。

作業
-------

まず該当のPublic IPリソースを見に行くと以下のような「紫のお知らせ」がでるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/9cbc5fea-6d52-0b3c-c757-ee07951c58ed.png)

ふむふむ、とクリックすると、静的でないとアップグレードできないと出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/ec79b904-f9bc-3868-5d07-da6ddaac1204.png)

これは以下の作業が必要です。

- Public IPの構成で「動的」から 「静的」でないといけない
- Public IPの「関連付けを解除」しないといけない

なのでVMに対して一通り作業しました。

### Public IPの構成で「動的」から 「静的」へ変更

作業においてはVMを停止する必要はありません。

なお、静的にすると動的には戻せないので注意です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/1c4ef0f9-aabc-e259-2356-235fa6477d6b.png)

なお、この際IPは変わりませんでした。

### Public IPの「関連付けを解除」する

この作業を行うと該当のリソース(VM等)は、パブリックネットワークと疎通が取れない状態になります。

関連付けを解除はPublic IPが割り当たっているネットワークインタフェースでもできますが、Public IPのリソースで行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/13a83a4b-d594-4bd6-f0c7-f92c2a593c5d.png)

ボタンを押して進めるだけです。

### Standard SKUへ移行

先ほどの「紫のお知らせ」からアップグレードが行えるようになっています（開きっぱなしだったりした場合は変化しないことがあるので、ブラウザのリロードをしましょう）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/38a5d91c-a827-faef-ddcd-664cd110347c.png)

なお、この際もIPは変わりませんでした。

### Public IPの「関連付け」を行う

関連付けもPublic IPが割り当たっているネットワークインタフェースでもできますが、Public IPのリソースで行います。

リソースの種類でネットワークインタフェースを選び、ネットワークインタフェースを選んで関連付けするだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/3f9d1c9f-4951-41a8-c4c7-22ff2ce462a1.png)


### 以上

作業自体は以上です。

後はアプリケーションなどがちゃんと仕事しているかどうかチェックしましょう。

おまけ
----------

どうでもいいかもしれない豆知識のコーナーです

### はいはい、わかったわかった。まだ3年あるし、後でやるよ。

フォーラムで触れられていますが、**2025/03/31以降はPublic IPのBasic SKUは作れなくなる** ようです。

https://learn.microsoft.com/en-us/answers/questions/1025889/action-required-upgrade-from-basic-to-standard-sku.html

デッドラインはこの辺にしておくといいでしょう。予定表に入れておきましょう。

### 該当する一覧がほしい

やり方は色々ありますが、SKUがBasicのモノを絞ればよいでしょう。CLIなどでもできるはずです。

テナント毎に見る必要はありますが、[Public IPのリソース一覧](https://portal.azure.com/#view/HubsExtension/BrowseResource/resourceType/Microsoft.Network%2FPublicIpAddresses) の画面でフィルタにSKUをかければ該当するパブリックIPがわかるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/eb6552be-0fa3-6bec-5c0e-d4865dd754e8.png)

Azure CLIなら以下とかでどうでしょうか。

``` bash
az network public-ip list --query "[?sku.name=='Basic']" --output table 
```

### 関連付け解除～関連付けの操作中のVMのネットワーク影響が気になる

UbuntuのVMでSSH接続を行い、定期的にcurlでIPを確認するURLを叩くスクリプトを走らせながら作業してみました。

``` bash
(
  while sleep 2; do
    curl -s -m 5 https://domains.google.com/checkip;
    echo;
  done
) | 
  perl -MTime::Piece -nle '$|=1;print(scalar(localtime()), ": ", $_);' |
  tee dump.txt &
```

（本当はセッションが切れると芋づる式にプロセスを止められてしまうので、nohupしたりしたほうがいいが、短期間ならSSHセッションが復帰できるのでこのまま行った）

このスクリプトを流しながら、関連付け解除し、すぐ割り当てを行ってみました。

結果としては、関連付け解除が反映された直後と、それから関連付けが反映されるまでの間、通信がうまく行えていない状態となりました。

![結果イメージ（動画は加工がめんどいので図で...）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/e82dc55b-8bf1-dadb-a0e1-a5b2cc432a6a.png)

タイムラインとしては以下の感じでした。

- 15:08:14: 疎通（割り当たっているIP）
- 15:08:21: 関連付け解除の操作
- 15:08:38: タイムアウト
- 15:08:41: 疎通（謎のIP）
- 15:09:13: 関連付けの操作
- 15:09:27: 関連付け反映（割り当てたIP）


少しタイムアウトがあった後、謎のIPで外側と通信できていますが、これは[AzureはPublic IPがなくても外に出れる](#azureはpublic-ipがなくても外に出れる) 仕様によります。これでVMからみてアウトバウンド通信はカバーできるかもしれませんが、実稼働で使うべき機能ではないし、IPも異なるためIPで許可している通信先には使えません。それを承知であればアウトバウンドの通信は瞬断で済むかもしれません。
ただ、多分通信中にいきなりIPが変わるので、相手から見ると急に変なIPから通信が来たように見えて、うまく通信できなくなる可能性はありそうです。（タイムアウトはもしかしたらそのあたりの影響かも？）


VMからみてインバウンド通信のほうは当然できなくなりました。（SSHセッションはしばらく応答が無くなりました。）ただ関連付けを行いネットワーク的に疎通が取れるようになるとSSHセッションは切断されることなく復帰しました。タイムアウト設定によってはこの動きのおかげで影響が出ないで済むかもしれません。

もちろん通信プロトコルやアプリケーションの性質にもよってはこの通りの挙動をしないことも考えられます。なので期待せずに、止まるものとして考え最悪アプリケーションやVMを再起動できる余裕を持たせて挑むほうが良いでしょう。

### SKUをアップグレードするとレベル・ゾーンはどうなるのか？

実際にリソースを作って比較しましたが、レベルは「Regional」、ゾーンは「ゾーンなし」になるようです。

違いはリソースの「場所」を見るとわかります。「ゾーンなし」と同じようなので多分ゾーンなしでしょう。

| 操作  | キャプチャ  |
|---|---|
| BasicからStandardに移行したIP | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/2585591a-c5f2-2ffc-2ef2-d442a8f9c022.png) | 
| 「ゾーンなし」で作ったPublic IP | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/e932a52b-85f1-f310-c42e-ece3adb4fe39.png) |
| 「ゾーン2」で作ったPublic IP | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/06d0a063-1890-8fcd-db02-f20ed994b406.png) |
| 「ゾーン冗長」で作ったPublic IP | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/14f1fc50-43e5-8af4-f9d7-2deeba1792f7.png) |

### アップグレードしなくても新しくPublic IPを作って割り当てでもよいのでは？

よさそうです。
VM(NIC)においては、別のPublic IPを作って関連付けを変えて対応することもできそうでした。
同じIPは取れないのでIPは変わってしまいますが、IPは事前にわかりますし、影響が出る時間は抑えられそうなので、アウトバウンドが主な通信ではこれも手かもしれません。


### 動的IPを割り当てているVMを割り当て解除するとIPが変わる

文字通りの意味でご存じだとは思いますが、IPが変わって困る場合は、作業前にVM停止を先に行わないようにしましょう。

### Public IPにFQDNを振ることができる

Public IPリソースにはFQDNを割り振れます。AWSのIPベースのFQDNとは違い任意の名前を使えるのがうれしいところです。
デフォルトは未設定で、構成から設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/3fe0fa88-9e57-32a9-30a3-0bdefe27ef2d.png)

これをDNSのCNAMEに使うとIPが変わっても気にしなくて済むという便利機能だったのですが、Standard SKUだと固定IPになるので影の薄い機能になるでしょう。

ただ、Azure DNSならエイリアスがあったのでIPが変わっても困らなかったり、CNAMEではなくAレコードじゃないとダメなケースもあるので万能ではないですが。

### ~~AzureはPublic IPがなくても外に出れる~~

※2023-09-29追記: 既定のSNATが2025年9月30日に廃止されます。今後は明示的な指定をしないかぎり外と通信できなくなります。

詳しくはサポートチームのBlogをお読みください。

https://jpaztech.github.io/blog/network/snat-options-for-azure-vm/

※追記ここまで

AzureはPublic IPがなくても外に出れるケースが存在します。NAT GatewayやLBのSNAT、Azure Firewallなどがあるともちろんそういったことができますが、それらがないときでも推奨されていませんが「既定の送信アクセス」というのが使うことで外に出ることができます。

これが起きると何で通信できるのか不思議に思うことがあるかもしれません。また、セキュリティポリシーに触れる場合があったりなかったりするかもしれませんので覚えておくと良いでしょう。

https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/default-outbound-access

https://learn.microsoft.com/ja-jp/azure/load-balancer/load-balancer-outbound-connections#4-default-outbound-access


終わり
----------

まだ3年あります。ゆっくりやっていきましょう（私には担当者が消えている未来や、直前であわてて対応する未来が見えます）