Azure VNet 複数プレフィックスを持つサブネット

Azure 仮想ネットワークのサブネット内に複数のアドレスプレフィックスを設定する機能がパブリックプレビューとなっております。
今まで対応が難しかったサブネット内のアドレス空間の拡張やサブネットの IP アドレスを入れ替えるといった作業をリソース削除なしでできるようになります。
実際に検証し、留意点や動作をまとめております。

https://learn.microsoft.com/ja-jp/azure/virtual-network/how-to-multiple-prefixes-subnet?tabs=powershell

## 利用シナリオ

- サブネット内のアドレス数が枯渇しており、アドレス空間の拡張が必要
- サブネット内のアドレスレンジを別のアドレスレンジに変更したい

## 留意点

- NIC に対して複数のプライベート IP アドレスを割り当てるのはサポートされていない
- 追加するアドレスレンジについても予約 IP アドレスが存在する (最初の 4 つと最後の 1 つ)
- 委任されたサブネットはサポートされていない (AppService や PowerPlatform 等)

## 構成
以下のような構成でサブネットにアドレス空間を追加したり、入れ替えたりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/2888e2cc-e240-f109-e0d3-1f8e2391411d.png)

## 動作確認
### 事前準備1 (VNet の準備)
VMSS をデプロイするための VNet と Subnet を準備します。(構成図のようなシンプルなもの)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/abdb3feb-f93b-9fe4-f25f-284282970d55.png)

### 事前準備2 (VMSSS デプロイ)
[こちら](https://learn.microsoft.com/ja-jp/azure/virtual-machine-scale-sets/flexible-virtual-machine-scale-sets-portal) を参考にVMSS を対象の状態のサブネットにデプロイしておきます。
インスタンス数は 3 つでデプロイしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/ecf36b94-f203-4bfd-9e5c-bb650908bae3.png)

こんな状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/87741f6a-6bd0-5956-07f1-504ea66ca208.png)


### 事前準備3 (プレビュー登録)

Azure CLI にログインします。(Azure Powershell でも可)
```
az login
```

以下のコマンドでプレビュー登録をします。
```
az feature register --namespace Microsoft.Network --name AllowMultipleAddressPrefixesOnSubnet
az feature register --namespace Microsoft.Network --name AllowDeletionOfIpPrefixFromSubnet
```

### サブネットへアドレス空間を追加
Azure CLI コマンドにて "172.16.0.0/28" のアドレスレンジを VMSS 用のサブネットに追加します。

```
az network vnet subnet update \
--name subnet-b-multi-001 \
--vnet-name vnet-spoke-b-001 \
--resource-group rg-spoke-b-001 \
--address-prefixes 10.12.8.0/29 172.16.0.0/28
```

サブネットが追加されたことを確認します。
```
{
  "addressPrefixes": [
    "10.12.8.0/29",
    "172.16.0.0/28"
  ],
  "delegations": [],
  "etag": "W/\"d36e8f48-79e1-4a25-8dbb-bc643fc133ab\"",
  ～省略～
}
```

### スケールアウト
VMSS のインスタンス数を 6 まで増やします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/def7640c-7277-2a2d-2c3e-96ee60c5b75b.png)

仮想ネットワークの接続されたデバイスの画面から追加したアドレスレンジが利用されていることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/656d32da-b1cd-a58a-6047-3a3d03898a7f.png)

こんな状態です。(スケールセットは分かれてません。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/6d0dd239-16b1-198d-251a-334c322551b4.png)


### スケールイン＆既存レンジの削除
既存のアドレスレンジである "10.12.8.x" を利用しているインスタンスを削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/d477704c-2c06-63c1-879b-f2ecad45d7bf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/6701e8d5-b3d9-19e9-3715-11e7d91dda20.png)

こんな状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/0701a290-1709-e258-9868-a1db6c9b9942.png)

既存のアドレスレンジである "10.12.8.0/29" を削除します。
```
az network vnet subnet update \
--name subnet-b-multi-001 \
--vnet-name vnet-spoke-b-001 \
--resource-group rg-spoke-b-001 \
--address-prefixes 172.16.0.0/28
```

既存のアドレスレンジが削除されたことを確認します。
```
{
  "addressPrefixes": [
    "172.16.0.0/28"
  ],
  "delegations": [],
  "etag": "W/\"c079b17a-fa0c-4b2e-9fa8-233c6eab9c0b\"",
  ～省略～
}
```
こんな状態になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/041692a6-b954-b34d-7a68-8225078c12ec.png)

## VM の IP アドレスを付け替える
こんな構成で VM の Private IP を付け替えてみます。
サブネットを付け替えることは以前からできますが、この方法だと NSG, UDR, NAT Gateway, サービスエンドポイント等の設定変更は不要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/3eec696f-61e5-561c-26d1-62e695881898.png)

VM をポータルから呈した状態で、NIC の画面から Private IP アドレスを変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/b8745925-736a-9e9e-1375-843b69ac76d7.png)

起動後、VM の IP アドレスが変わっておりました。

```
hiyama@vm-multip-001:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0d:3a:cc:a1:bf brd ff:ff:ff:ff:ff:ff
    inet 10.12.6.4/25 brd 10.12.6.127 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20d:3aff:fecc:a1bf/64 scope link 
       valid_lft forever preferred_lft forever
hiyama@vm-multip-001:~$ 
```

試しにこの VM に Private IP を追加する作業を行ってみましたが、制限事項の通りエラーとなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/75519f6f-39f0-a3af-1c25-477b758a72b1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/d7d14975-ffdd-cc3d-b069-85c306ae7be5.png)


## Application Gateway で試してみる
以下のような構成で Application Gateway を作成し、サブネットより大きい数のスケールアウトを行ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/0f750f84-c837-c20e-ecc6-2ddc0c8876a0.png)

サブネットのサイズが足りないためエラーとなってしまいました。今後の機能改善に期待したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/0bbb54ab-6739-1d88-7687-8f88a3478243.png)