AWS VPC IPv6-only subnet 作ってみた

## 初めに

2021/11/23にAWSのブログに投稿された「[Introducing IPv6-only subnets and EC2 instances](https://aws.amazon.com/blogs/networking-and-content-delivery/introducing-ipv6-only-subnets-and-ec2-instances/)」というブログにて、IPv6アドレスのみが割り当てられるsubnetが作れるようになったとの紹介がありました。

気になったので、ブログの通りに実際にIPv6-onlyのsubnetを作ってみようと思います。

## 1. IPv6を有効化したVPCの作成

1. AWSのマネジメントコンソールから、VPCのページを開く。
1. "Create VPC"を選択して作成画面へ行く。
1. Name tagやIPv4 CIDRを適当に入力し、IPv6 CIDR blockの設定を "Amazon-provided IPv6 CIDR block" にする。![Screen Shot 2021-12-18 at 12.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/0b966d22-7ec3-f6e4-c3c1-d34380da3c29.png)
1. "Create VPC" を押してVPCを作成する。

## 2. Internet Gatewayのattach
手元からsshでEC2インスタンスに接続するので、上記で作成したVPCにInternet Gatewayをアタッチしておく。これはIPv6のVPCに限った話ではないので手順は省略する。もし分からなければ[「Internet gateways - Amazon Virtual Private Cloud」](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html#Add_IGW_Attach_Gateway)などを参考に。

## 3. IPv6-only subnetの作成
1. subnetsのページを開く。
1. "Create subnet" を選択して作成画面へ行く。
1. VPC IDは先ほど作成したIPv6が有効になっているVPCを選ぶ。![Screen Shot 2021-12-18 at 12.03.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/107ac615-a367-3dbf-2444-95f6bf519e96.png)
1. Name tagとAZは適当に入力する。 
1. "IPv6-only" のチェックボックスにチェックを付け、適当なIPv6 CIDRを入力する。![Screen Shot 2021-12-18 at 12.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/65fb3366-0732-46a0-f7b9-afd130ea35a7.png)
1. "Create subnet"を押してsubnetを作成する。

## 4. 作成したIPv6-only subnetの確認
1. subnet一覧から先ほど作成したIPv6-only subnetを選んでチェックを付け、Detailsタブを確認する。
1. IPv4が無効になっており、IPv6-onlyになっていることが確認できる。![Screen Shot 2021-12-18 at 12.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/562072e6-bf9c-b905-c4fe-2d4cc8702104.png)
1. また、IPv4アドレスのためのAレコードが無効になっており、IPv6アドレスのためのAAAAレコードが有効になっていることも確認できる。![Screen Shot 2021-12-18 at 12.19.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/aa78cec0-ffb3-7887-7c67-1f0508e7de3c.png)

## 5. ルートテーブルの編集
手元からEC2インスタンスにssh接続するため、上記で作成したIPv6-only subnetからインターネットへのルーティングを追加する。具体的には、subnetに紐づいているルートテーブルに以下のルールを追加すればOK

| 項目 | 値 |
| --- | --- |
| Destination | ::/0 |
| Target | <先ほど作成したInternet Gateway> |

## 6. IPv6-only EC2インスタンスの作成
1. EC2のページを開く。
1. "Launch Instances" を選択し、作成画面へ行く。
1. AMIとインスタンスタイプを適当に選ぶ。(筆者はAmazon Linux 2とt3.nano)
1. Step 3: Configure Instance Details で先ほど作成したIPv6対応のVPCとsubnetを選択し、"Auto-assign IPv6 IP" が "Use subnet setting(Enabled)"、"DNS Hostname" の "Enable resource-based IPv6 (AAAA record) DNS requests" にチェックがついていることを確認する。![Screen Shot 2021-12-18 at 12.29.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/948be15c-3d59-2224-7da7-c818887df649.png)
1. Security Groupの設定で、自分のIPv6からssh接続できるようにしておく([Test your IPv6.](https://test-ipv6.com/)とか使えば自分のIPv6は分かる)。
1. `ssh -i <秘密鍵ファイルへのパス> <ユーザー名(Amazon Linxu 2ならec2-user)>@<EC2インスタンスのIPv6アドレス>` でEC2インスタンスにssh接続する。
![Screen Shot 2021-12-19 at 20.40.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534248/135b48ab-86cb-6ba5-0fa0-38af6f984263.png)

EC2インスタンスのpublic IPv6アドレスがeth0にアタッチされていることが確認できますね。

## 7. IPv6アドレスでEC2 Instance Metadata Serviceを利用
IPv6-onlyのEC2インスタンスではIPv6アドレスでEC2 Instance Metadata Serviceを利用できるらしいです。試してみましょう。

まずは手元のawscliから機能を有効化します。

```
aws ec2 modify-instance-metadata-options --instance-id <your-instance-id> --http-protocol-ipv6 enabled
```

成功するとなんかしらjsonが返ってきます。

そして、EC2インスタンス内でMetadata Serviceを叩いてみます。

```
$ curl -w "\n" --connect-timeout 10 'http://[fd00:ec2::254]/latest/meta-data/hostname'
i-08585e84944be3911.ap-northeast-1.compute.internal
```

hostnameが取得できますね。

もちろんIPv6アドレス取ってくることもできます。

```
$ curl -w "\n" --connect-timeout 10 'http://[fd00:ec2::254]/latest/meta-data/ipv6'
2406:da14:326:1820:e24:bb12:f341:30e0
```

Metadata Serviceのアドレスに`ec2`って入っているのかわいいですね。おしまい。