Amazon SQSがIPv6をサポートしたので実際に試してみた
お疲れさまです。とーちです。
Amazon SQSがIPv6をサポートしたというアップデートがありました。
私は正直、今までIPv6に全く触れていなかったのですが、良い機会なので、上記のアップデートを試すのも兼ねてVPC上のEC2からAmazon SQSにIPv6でキューイングしてみます。
なお、VPC上でのIPv6の基本的な部分については以下の記事が参考になりました。
やってみる
まずは以下のような構成を作りIPv6で接続するための環境を作るところからはじめます。
開発端末からIPv6のみを持つEC2に接続するために、EC2からSessionManagerへの接続を行っています。SessionManagerは私が調べた限りでは2025/4現時点でのIPv6のエンドポイントは用意されていないようでした。そのため、NAT GatewayでIPv4⇔IPv6の変換を行う必要があります。
このあたりのSessionManagerを使ったIPv6環境への接続方法は以下のブログでも説明されていますので、ぜひこちらもご参照ください。
各リソースの設定ポイント
今回作成してみて、注意が必要だと思った設定箇所をリソースごとに以下に記載します。
VPCの設定
IPv4とIPv6、両方のCIDRを設定するようにしてください。上記の通りNAT Gatewayを置くサブネットでIPv4アドレスを使います。
サブネットの設定
パブリックサブネットについては、IPv4とIPv6、両方のCIDRを設定するようにしてください。
プライベートサブネットについては上記構成においてはIPv6のみでOKです。
またプライベートサブネットについてはDNS64の設定を有効にしてください。
これによって以下のようにIPv6アドレスが存在しないホスト名を名前変換した際に、64:ff9b::/96プレフィックス
がついたIPv6アドレスを返すようになります。ルートテーブルで、64:ff9b::/96
宛の通信をNAT Gatewayに向けることで、IPv6アドレスに対応していないサービスはNATを経由してIPv4で通信されるというわけです。
sh-5.2$ dig AAAA ssm.ap-northeast-1.amazonaws.com
;; ANSWER SECTION:
ssm.ap-northeast-1.amazonaws.com. 54 IN AAAA 64:ff9b::3477:ded3
ルートテーブルの設定
パブリックサブネット用ルートテーブルにはIPv4(0.0.0.0/0)の場合にInternet Gatewayへルーティングされるルートが必須です。これはNAT GatewayがIPv4で通信をするためです。::/0 → Internet Gateway
のルートは不要だと思いますが、一応追加しておきました。
プライベートサブネット用ルートテーブルにはNAT向けのルート(64:ff9b::/96 → NAT Gateway
)とEgress Only Internet Gateway向けのルート(::/0 → Egress Only Internet Gateway
)が必要です。それぞれの用途は上記の構成図をご確認頂ければと思います。
EC2インスタンスの作成
ネットワークを作成した後はEC2インスタンスを作成します。IPv6アドレスを割り当てる設定を有効にしてください。
また、AmazonSSMManagedInstanceCore
ポリシーと AmazonSQSFullAccess
(SQSへのキューイングに使用) ポリシーを持つIAMロールを付与するようにします。それ以外は特別な設定はしていないです。なお、OSはAmazonLinux2023を使いました。
SQSキューの作成
SQSのキューについても特別な設定は不要です。今回はマネジメントコンソールから標準キューを全てデフォルトのまま作成しました。
EC2インスタンスへの接続
ここまで出来たら準備は完了です。まずはSessionManagerでEC2インスタンスに接続してください。ネットワークが適切に設定されていれば接続できるはずです。
SQSへのIPv6接続
それではSQSにIPv6で接続してみましょう。調べたところ、SQSのIPv6対応は以下のようになっていました。
- デュアルスタックサポート:有効
- パブリックエンドポイントは IPv6 をサポート:有効
ご参考:AWS services that support IPv6 - Amazon Virtual Private Cloud
またSQSのエンドポイントは東京リージョンの場合、以下の2つです。
- sqs.ap-northeast-1.amazonaws.com
- sqs.ap-northeast-1.api.aws
ご参考:Amazon Simple Queue Service endpoints and quotas - AWS General Reference
上記のうちどちらがIPv6をサポートしているかですが、digで調べてみると確実です(dns64が有効なサブネット上でdigを実行すると上記の通りIPv6アドレスを返すので注意)。sqs.ap-northeast-1.api.aws
のほうはIPv6アドレスを返していますね。
> dig AAAA sqs.ap-northeast-1.amazonaws.com
; <<>> DiG 9.10.6 <<>> AAAA sqs.ap-northeast-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6839
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;sqs.ap-northeast-1.amazonaws.com. IN AAAA
;; AUTHORITY SECTION:
sqs.ap-northeast-1.amazonaws.com. 51 IN SOA ns-307.awsdns-38.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 60
<以後省略>
> dig AAAA sqs.ap-northeast-1.api.aws
; <<>> DiG 9.10.6 <<>> AAAA sqs.ap-northeast-1.api.aws
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19701
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;sqs.ap-northeast-1.api.aws. IN AAAA
;; ANSWER SECTION:
sqs.ap-northeast-1.api.aws. 5 IN AAAA 2406:da70:4000:430:183a:bd6d:eeab:9a2d
<以後省略>
また公式ドキュメントでは以下に記載があります。
通信の確認
事前に以下のコマンドでtcpdumpを取っておきましょう。後でIPv6で通信出来ていることを確認するためです。<ipv6_address_*>
の部分には上記のようにdigで調べたIPv6アドレスを入れます。SQSのIPv6アドレスは数秒おきに変化するためです。(もっと効率的な方法があるかもしれませんが、現時点ではこの方法で確認します)
sudo tcpdump -i <your-interface> -n 'ip6 and tcp port 443 and (host <ipv6_address_1> or host <ipv6_address_2> or host <ipv6_address_3>)'
この状態でEC2インスタンスから以下のコマンドを実行します。以下のようにMessageIdが返ってくれば正常にキューイングできています。
sh-5.2$ aws sqs send-message \
--endpoint-url https://sqs.ap-northeast-1.api.aws \
--queue-url https://sqs.ap-northeast-1.amazonaws.com/XXXXXXXXXXXX/test \
--message-body "Test message"
{
"MD5OfMessageBody": "82dfa5549ebc9afc168eb7931ebece5f",
"MessageId": "404a75b4-e91b-4d67-a85d-d2d9980dce39"
}
tcpdumpの結果を見てみましょう。うまくフィルタで指定したアドレスが使われていれば以下のように出力されているはずです。
sh-5.2$ sudo tcpdump -i ens5 -n 'ip6 and tcp port 443 and (host 2406:da70:4000:410:b66d:36fb:eb7f:3df7 or host 2406:da70:4000:400:9d75:1c8e:7b6:3639 or host 2406:da70:4000:430:183a:bd6d:eeab:9a2d)'
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens5, link-type EN10MB (Ethernet), snapshot length 262144 bytes
04:09:02.490925 IP6 2406:da14:1ac6:a19:4c8d:2657:4754:8a89.43570 > 2406:da70:4000:410:b66d:36fb:eb7f:3df7.https: Flags [S], seq 3167986445, win 62587, options [mss 8941,sackOK,TS val 2240810226 ecr0,nop,wscale 7], length 0
04:09:02.492637 IP6 2406:da70:4000:410:b66d:36fb:eb7f:3df7.https > 2406:da14:1ac6:a19:4c8d:2657:4754:8a89.43570: Flags [S.], seq 2942058199, ack 3167986446, win 62643, options [mss 1440,sackOK,TS val 3539038898 ecr 2240810226,nop,wscale 7], length 0
04:09:02.492667 IP6 2406:da14:1ac6:a19:4c8d:2657:4754:8a89.43570 > 2406:da70:4000:410:b66d:36fb:eb7f:3df7.https: Flags [.], ack 1, win 489, options [nop,nop,TS val 2240810228 ecr 3539038898], length 0
04:09:02.502094 IP6 2406:da14:1ac6:a19:4c8d:2657:4754:8a89.43570 > 2406:da70:4000:410:b66d:36fb:eb7f:3df7.https: Flags [P.], seq 1:518, ack 1, win 489, options [nop,nop,TS val 2240810238 ecr 3539038898], length 517
04:09:02.503405 IP6 2406:da70:4000:410:b66d:36fb:eb7f:3df7.https > 2406:da14:1ac6:a19:4c8d:2657:4754:8a89.43570: Flags [.], ack 518, win 485, options [nop,nop,TS val 3539038909 ecr 2240810238], length 0
04:09:02.503464 IP6 2406:da70:4000:410:b66d:36fb:eb7f:3df7.https > 2406:da14:1ac6:a19:4c8d:2657:4754:8a89.43570: Flags [P.], seq 1:94, ack 518, win 485, options [nop,nop,TS val 3539038909 ecr 2240810238], length 93
04:09:02.503477 IP6 2406:da14:1ac6:a19:4c8d:2657:4754:8a89.43570 > 2406:da70:4000:410:b66d:36fb:eb7f:3df7.https: Flags [.], ack 94, win 489, options [nop,nop,TS val 2240810239 ecr 3539038909], length 0
04:09:02.503525 IP6 2406:da70:4000:410:b66d:36fb:eb7f:3df7.https > 2406:da14:1ac6:a19:4c8d:2657:4754:8a89.43570: Flags [P.], seq 94:100, ack 518, win 485, options [nop,nop,TS val 3539038909 ecr 2240810238], length 6
04:09:02.503528 IP6 2406:da14:1ac6:a19:4c8d:2657:4754:8a89.43570 > 2406:da70:4000:410:b66d:36fb:eb7f:3df7.https: Flags [.], ack 100, win 489, options [nop,nop,TS val 2240810239 ecr 3539038909], length 0
2406:da14:1ac6:a19:4c8d:2657:4754:8a89
がEC2自体についているグローバルIPv6アドレスですね。そのアドレスとSQSのIPv6エンドポイントのアドレスが通信しているのが確認できました。
ちゃんとSQSにもメッセージが送信されていますね。
まとめ
以上、Amazon SQS のIPv6サポートのアップデート紹介と実際にIPv6で通信をする様子の共有でした。今まで機会がなくIPv6に全く触れていなかったのですが、実際に体験してみるとだいぶIPv6に親近感が湧きました。なかなか業務で使う機会はないかもしれませんがチャンスがあれば導入してみたいですね。
以上、とーちでした。