IPv4 の VPC に IPv6 を追加してみた

# はじめに
IPv4 のパブリック IP が有料化になったこともあり、IPv6 について少し確認してみました。
せっかくなので記録として残しておきたいと思います。

# 構成
追加するネットワーク構成は以下になります。

![スクリーンショット 2024-06-03 15.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/62f10cc3-c3f5-9b03-5410-65efeed86d20.png)

今回は検証のため、赤枠の部分に設定してみました。

# 設定
**Step1. VPC ~ Step.2 サブネット ~ Step3. ルートテーブル** の流れで設定を行いたいます。

## Step1. VPC に IPv6 CIDR の追加
- `[ VPC > 対象のVPCを選択 > アクション > CIDR の 編集 ]` をクリック
![スクリーンショット 2024-05-10 11.25.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/e06eb813-1902-1809-9b16-cd31afa480b7.png)

- `[ 新しい IPv6 CIDR を追加 ]` をクリック
![スクリーンショット 2024-05-10 11.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/b8294bdc-ded7-a4d7-08ae-f0ac1dd6251d.png)


- 以下を選択して `[ CIDR を選択 ]` をクリック
  > Amazon 提供の IPv6 CIDR ブロック
  > ネットワークボーダーグループ：ap-northeast-1
![スクリーンショット 2024-05-10 11.26.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/5adfd096-8511-173a-9f4a-5ddc89b0d06c.png)

- IPv6 CIDR が割り当てられていることを確認し `[ 閉じる ]` をクリック
![スクリーンショット 2024-05-10 11.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/1f7f3238-bf0a-2e00-f861-8e6a3c828efb.png)


## Step2. サブネット に IPv6 CIDR の割り当て
先ほど VPC にて追加した IPv6 CIDR を サブネットに対し割り当てます。

- `[ VPC > サブネット ]` をクリック
- `[ 対象のサブネットを選択 > アクション > IPv6 CIDR の編集 ]` をクリック
![スクリーンショット 2024-05-10 11.28.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/b0d04a9d-103e-a55f-1905-26ad9e52d878.png)

### IPv6 CIDR の編集
- `[ サブネットの CIDR ブロック > IPv6 CIDR を追加 ]` をクリック
![スクリーンショット 2024-05-10 11.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/3a1d55e9-e116-f31d-8e5b-4a47fad61ea7.png)

- `[ 保存 ]` をクリック
  ※ 今回はデフォルトの CIDR ブロック で設定します。
![スクリーンショット 2024-05-10 11.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/059408c9-e133-1a2e-38c8-874c4b439c2d.png)

以下のように追加されていればOKです。
![スクリーンショット 2024-05-10 11.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/184eebae-962a-983a-c783-d51504172923.png)


## Step3. ルートテーブルの設定
- `[ VPC > サブネット > ルートテーブル > ルートテーブルのリンク ]` をクリック
![スクリーンショット 2024-05-10 11.38.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/d9e2f905-d179-f2da-4ecd-6b1a49f82f93.png)

- `[対象ルートテーブルにチェックを入れ > アクション > ルートを編集 ]` をクリック
![スクリーンショット 2024-05-10 11.39.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/f91d5614-037b-6f2f-025d-5c5e5c6cbe2b.png)

- ルートを追加 クリックし以下を入力 し `[ 変更 ]` をクリック
  > 送信先：::/0
  > ターゲット：インターネットゲートウェイ
![スクリーンショット 2024-05-10 11.40.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/519bbe00-2ab8-f465-c0a1-1eff77f242ea.png)

以下のように追加されていればOKです。
![スクリーンショット 2024-05-10 11.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/1a2afc50-6819-b46e-7f64-895f5290a3b3.png)


# 検証
NW 的には有効化されましたが、実際にインスタンスにはどのように有効化されるかを確認しました。

## 新規インスタンスの IPv6 化
作成時に **IPv6 IP を自動で割り当てる** を `有効` にしておくことで有効になります。
![スクリーンショット 2024-05-10 11.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/033b7b2e-4f15-8a6c-b98c-1ba01ea59490.png)

実際に確認してみると IPv6 が返ってくるのが確認できました。
```bash:IP 確認
$ curl ifconfig.io
2406:da14:1dfb:c6d7:d3a7:4552:70bf:e19
```

## 既存インスタンスの IPv6 化
この場合はちょっとだけ面倒で aws-cli や aws-sdk を利用する必要があります。

まずは IPv4 が返ってくることを確認します。
```bash:IP 確認
$ curl ifconfig.io
52.195.177.127
```

次に以下のコマンドを実行します。
```bash:assign-ipv6-addresses
% aws ec2  assign-ipv6-addresses --network-interface-id eni-03c2d829e90aa02c6 --ipv6-address-count 1
{
    "AssignedIpv6Addresses": [
        "2406:da14:1dfb:c6a5:6016:bfd2:3c6b:b7fc"
    ],
    "NetworkInterfaceId": "eni-03c2d829e90aa02c6"
}
```
アサインできたようなのでインスタンスを再起動します。
改めて確認すると IPv6 が返ってきました。
```bash:IP 確認
$ curl ifconfig.io
2406:da14:1dfb:c6a5:6016:bfd2:3c6b:b7fc
```

マネジメントコンソールからも付与されていることが確認できました。
![スクリーンショット 2024-05-10 14.44.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/12daa83d-3807-1b1c-ca45-7b4e6a8b9e2c.png)


# わかったこと
今回の検証を通してわかったことを以下にまとめてみました。

- **既存インスタンスの有効化には aws-cli や aws-sdk を利用**
調べた限りマネジメントコンソールで有効化させる機能は見つかりませんでした。
いずれは対応されるのかなと思います。
<br>

- **IPv6 の場合はプライベート IP とパブリック IP は同じアドレス**
今まで IPv4 の場合はプライベートとパブリックで異なる IP アドレスが利用されていました。
例えばプライベート IP が `172.16.1.141` でパブリック IP が `52.195.177.127` といった感じです。
IPv6 にはそのような区別がなく同じ IP になります。
  ```
  $ curl ifconfig.io
  2406:da14:1dfb:c6d7:d3a7:4552:70bf:e19

  $ ifconfig |grep net
      inet 172.16.1.141  netmask 255.255.255.0  broadcast 172.16.1.255
      inet6 fe80::499:78ff:fe38:4ceb  prefixlen 64  scopeid 0x20<link>
      inet6 2406:da14:1dfb:c6d7:d3a7:4552:70bf:e19  prefixlen 128  scopeid 0x0<global>
      ether 06:99:78:38:4c:eb  txqueuelen 1000  (Ethernet)
      inet 127.0.0.1  netmask 255.0.0.0
      inet6 ::1  prefixlen 128  scopeid 0x10<host>
  ```
  そのため、サブネットのルートテーブルに IGW をアタッチすると外部からアクセス可能になるため注意が必要です。
<br>

- **プライベートサブネットの場合は Egress-Only を利用するべき**
IPv4 の場合はプライベートサブネットが外部と通信するためには NAT ゲートウェイを用意していたと思います。
ですが、IPv6 では Egress-Only インターネットゲートウェイを利用するのが良いです。

  **追加前 (NAT 利用)**
![スクリーンショット 2024-06-03 17.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/1fcc7968-f7d1-48ff-763d-03c1f85c311a.png)

  **追加後 (Egress-Only 利用)**
![スクリーンショット 2024-06-03 17.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/02e7158b-0561-f632-df25-8de5c89f633c.png)

  理由は、**「利用料金が無料」** であることや **「AZ 単位で用意する必要がない」** などが挙げられます。
ただし、外部サービスを利用する際などで IP 許可などが必要な場合は引き続き NAT ゲートウェイを利用した方が良さそです。
<br>

- **サブネットへ割り当てる範囲に気を付ける**
IPv6 の場合、 VPC への CIDR 追加ができるのは 5 つまでのようです。
  > ### IPv6 VPC CIDR ブロック
  > 新しい VPC を作成する場合、単一の IPv6 CIDR ブロックを関連付けるか、または /44 から /60 の、/4 刻みで最大 5 つの IPv6 CIDR ブロックを関連付けることができます。

  そのため、今回みたいに VPC へ割り当てた CIDR をそのままサブネットに適用してしまうと足りなくなってしまう恐れがあるので注意が必要です。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-cidr-blocks.html#vpc-sizing-ipv6

- **IPv4 と IPv6 の両方が利用できる場合は IPv6 が優先される**
これは一般的な知識ではあるのですが両方利用できる場合は IPv6 を利用した通信が優先されます。



# おわりに
ちょっとした検証でしたが、IPv4 から IPv6 へ切り替えるのはかなりインパクトがあるなと感じました。
とはいえ、IPv4 のパブリック IP は今後利用費用がかかってしまいます。
すぐに切り替えるのは難しうとも、まずは並行利用しつつ徐々に切り替えていく意識は持ったほうがよさそうです。

---
**参考**

https://aws.amazon.com/jp/blogs/news/adual-stack-ipv6-architectures-for-aws-and-hybrid-networks-jp/

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/egress-only-internet-gateway.html

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-cidr-blocks.html#vpc-sizing-ipv6

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html