Azure Load BalancerとAzure VMのパブリックIPリプレイス

# 概要
[AzureのBasic SKUのパブリックIPが2025年09月30日に廃止される](https://azure.microsoft.com/ja-jp/updates/upgrade-to-standard-sku-public-ip-addresses-in-azure-by-30-september-2025-basic-sku-will-be-retired/)とマイクロソフトから2022年10月にアナウンスがありました。

![2024060401.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/64b6fc1c-241d-e119-af42-cb1782a0738f.jpeg)

このEOLに対応するため、Basic SKUのバブリックIPが関連付けられた社内のAzureリソースを調査した所、**Azure Load Balancer**と**Azure VM**が関連づけられており、Standard SKUのバブリックIPへのリプレイスが必要という事が判明しました。

本件に対応するため、PowerShell、またはAzure CLI（azコマンド）を用いたStandard SKUのパブリックIPをリプレースする手順をご紹介します。

# 前提
- PowerShell、またはAzure CLI（azコマンド）を使用するため、自身の環境でセットアップしてください。
- 記載しているコマンドと既存リソースに差異がある場合はコマンド or オプションを適宜変更してください。

# Azure Load Balancer
Azure Load BalancerでパブリックIPをBasic SKUからStandard SKUに切り替える場合の手順は以下の通りです。

:::note warn
ダウンタイムが発生するため、必ずステイクホルダーと合意の上、メンテナンス時間を設けて作業してください。
:::

:::note warn
- Azure Load BalancerおよびパブリックIPのSKUがBasic SKUからStandard SKUにアップグレードされるため、コストが上昇します。
- ダウンタイムは1分程度（リソースによって異なる可能性あり）
- アップグレードの完了時間は大体2-3分程度（リソースによって異なる可能性あり）
:::

## 1. モジュールのインストール

```powershell
Install-Module -Name AzureBasicLoadBalancerUpgrade -Scope CurrentUser -Repository PSGallery -Force
```

## 2. サブスクリプションへの接続

```powershell
Connect-AzAccount -Subscription <SUBSCRIPTION_ID> -UseDeviceAuthentication
```

:::note info
コマンドレットを実行すると、デバイス認証用のURLとコードが表示されます。ブラウザを開き、表示されたURLにアクセスします。表示されたコードを入力し、Azureアカウントでログインします。
:::
## 3. アップグレード前のシナリオを検証

```powershell
Start-AzBasicLoadBalancerUpgrade -ResourceGroupName <RESOURCE_GROUP_NAME> -BasicLoadBalancerName <LB_NAME> -validateScenarioOnly
```

以下の警告が表示された場合は、アップグレード実施後に「**5. 送信規則の作成**」の実行が必要になります。

```powershell
基本ロード バランサー「<LB_NAME>」には複数のバックエンド プールがあり、外部です。移行によって、標準ロード バランサーにデフォルトの送信ルールは作成されません。移行後に手動でデフォルトの送信ルールを作成する必要があります。作成するまで、バックエンド プールのメンバーは送信インターネット アクセスを使用できません。
```

※Basic SKUのリソースでは、表示上存在していなかった項目です。上記はデフォルト値を指定しています。

## 4. アップグレード

```powershell
Start-AzBasicLoadBalancerUpgrade -ResourceGroupName <RESOURCE_GROUP_NAME> -BasicLoadBalancerName <LB_NAME>
```

以下のエラーが表示された場合は、バックエンドプールにAzure VMを追加するか、インバウンドNAT規則に設定されている規則を一時的に削除するかで解消されます。また、バックエンドプールにAzure VMを追加する場合は「**5. 送信規則の作成**」の実行が必要になります。

```powershell
Write-Error: YYYY-MM-DDThh:mm:ss+00 [Error]:[Test-SupportedMigrationScenario] Error comparing NIC backend pool memberships () to basicLBBackendIds ().                                                                                                            
Error: Cannot bind argument to parameter 'DifferenceObject' because it is null.
```

## 5. 送信規則の作成

```bash
az network lb outbound-rule create \
    --resource-group <RESOURCE_GROUP_NAME> \
    --lb-name <LB_NAME> \
    --name <OUTBOUND_RULE_NAME> \
    --frontend-ip-configs <FRONTEND_IP_CONFIGS> \
    --backend-address-pool <BACKEND_ADDRESS_POOL> \
    --outbound-ports 10000 \
    --allocated-outbound-ports 0 \
    --protocol All \
    --idle-timeout 4 \
    --enable-tcp-reset true
```

:::note info
Basic SKUのリソースでは、表示上存在していなかった項目です。上記のコマンドではデフォルト値を指定しています。
:::

## 6. 動作確認

インフラ側、またはアプリケーション側の観点で動作確認を実施。

# Azure VM
Azure VMでパブリックIPをBasic SKUからStandard SKUに切り替える場合の手順は以下の通りです。

:::note warn
ダウンタイムが発生するため、必ずステイクホルダーと合意の上、メンテナンス時間を設けて作業してください。
:::

:::note warn
- パブリックIPのSKUがBasic SKUからStandard SKUにアップグレードされるため、コストが上昇します。
- ネットワークインターフェイスに異なるSKUのパブリックIPを複数アタッチできません。
- 実行中のAzure VMに対してネットワークインターフェイスのアタッチ・デタッチはできません。
- 複数台のAzure VMが可用性セットに登録されている場合は、全てのAzure VMのパブリックIP（Basic SKU）の関連付けを解除してください。
:::

## 1. テナントへのログイン

```bash
az login --tenant <TENANT_NAME> （例: <テナント名>.onmicrosoft.com）
```

## 2. Azure VMを停止

```bash
az vm stop \
    --name <VM_NAME> \
    --resource-group <RESOURCE_GROUP_NAME>
```

## 3. 既存のパブリックIP（Basic SKU）の関連付けを解除

```bash
az network nic ip-config update \
    --name <IPCONFIG_NAME> \
    --nic-name <NIC_NAME> \
    --resource-group <RESOURCE_GROUP_NAME> \
    --remove PublicIPAddress
```

## 4. パブリックIP（Standard SKU）をアップグレード

```bash
az network public-ip update \
    --name <BASIC_PUBLIC_IP_NAME> \
    --resource-group <RESOURCE_GROUP_NAME> \
    --allocation-method static \
    --sku Standard
```

:::note info
Basic SKUのパブリックIPの数だけ繰り返してください。
:::

## 5. アップグレードしたパブリックIP（Standard SKU）をVMに関連付ける

```bash
az network nic ip-config update \
    --name <IPCONFIG_NAME> \
    --nic-name <NIC_NAME> \
    --resource-group <RESOURCE_GROUP_NAME> \
    --public-ip-address <STANDARD_PUBLIC_IP_NAME>
```

:::note warn
複数台のAzure VMが可用性セットに登録されている場合は、全てのAzure VMのパブリックIP（Basic SKU）の関連付けを解除してください。関連付けを解除していない場合、エラーになります。
:::

## 6. Azure VMを起動

```bash
az vm start \
    --name <VM_NAME> \
    --resource-group <RESOURCE_GROUP_NAME>
```

## 7. 動作確認

インフラ側、またはアプリケーション側の観点で動作確認を実施。

# 参考
- [PowerShell を使って Basic Load Balancer をアップグレードする](https://learn.microsoft.com/ja-jp/azure/load-balancer/upgrade-basic-standard-with-powershell?source=docs)
- [az network public-ip | Microsoft Learn](https://learn.microsoft.com/ja-jp/cli/azure/network/public-ip?view=azure-cli-latest)
- [az network nic | Microsoft Learn](https://learn.microsoft.com/ja-jp/cli/azure/network/nic?view=azure-cli-latest)
- [az network lb | Microsoft Learn](https://learn.microsoft.com/ja-jp/cli/azure/network/lb?view=azure-cli-latest)
- [az vm | Microsoft Learn](https://learn.microsoft.com/ja-jp/cli/azure/vm?view=azure-cli-latest)