初めに
2021/11/23にAWSのブログに投稿された「Introducing IPv6-only subnets and EC2 instances」というブログにて、IPv6アドレスのみが割り当てられるsubnetが作れるようになったとの紹介がありました。
気になったので、ブログの通りに実際にIPv6-onlyのsubnetを作ってみようと思います。
1. IPv6を有効化したVPCの作成
- AWSのマネジメントコンソールから、VPCのページを開く。
- "Create VPC"を選択して作成画面へ行く。
- Name tagやIPv4 CIDRを適当に入力し、IPv6 CIDR blockの設定を "Amazon-provided IPv6 CIDR block" にする。
- "Create VPC" を押してVPCを作成する。
2. Internet Gatewayのattach
手元からsshでEC2インスタンスに接続するので、上記で作成したVPCにInternet Gatewayをアタッチしておく。これはIPv6のVPCに限った話ではないので手順は省略する。もし分からなければ「Internet gateways - Amazon Virtual Private Cloud」などを参考に。
3. IPv6-only subnetの作成
- subnetsのページを開く。
- "Create subnet" を選択して作成画面へ行く。
- VPC IDは先ほど作成したIPv6が有効になっているVPCを選ぶ。
- Name tagとAZは適当に入力する。
- "IPv6-only" のチェックボックスにチェックを付け、適当なIPv6 CIDRを入力する。
- "Create subnet"を押してsubnetを作成する。
4. 作成したIPv6-only subnetの確認
- subnet一覧から先ほど作成したIPv6-only subnetを選んでチェックを付け、Detailsタブを確認する。
- IPv4が無効になっており、IPv6-onlyになっていることが確認できる。
- また、IPv4アドレスのためのAレコードが無効になっており、IPv6アドレスのためのAAAAレコードが有効になっていることも確認できる。
5. ルートテーブルの編集
手元からEC2インスタンスにssh接続するため、上記で作成したIPv6-only subnetからインターネットへのルーティングを追加する。具体的には、subnetに紐づいているルートテーブルに以下のルールを追加すればOK
項目 | 値 |
---|---|
Destination | ::/0 |
Target | <先ほど作成したInternet Gateway> |
6. IPv6-only EC2インスタンスの作成
- EC2のページを開く。
- "Launch Instances" を選択し、作成画面へ行く。
- AMIとインスタンスタイプを適当に選ぶ。(筆者はAmazon Linux 2とt3.nano)
- 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" にチェックがついていることを確認する。
- Security Groupの設定で、自分のIPv6からssh接続できるようにしておく(Test your IPv6.とか使えば自分のIPv6は分かる)。
-
ssh -i <秘密鍵ファイルへのパス> <ユーザー名(Amazon Linxu 2ならec2-user)>@<EC2インスタンスのIPv6アドレス>
でEC2インスタンスにssh接続する。
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
って入っているのかわいいですね。おしまい。