IPv6 Onlyでインターネット公開するAWSのEC2
1.目的
AWSにおいて2024年2月1日よりパブリックIPが課金対象となることから、パブリックIP/Elastic IPを使わない構成として、IPv6 Onlyでインターネット公開するEC2を構築したいです。
なお、パブリックIPは1IPで1時間あたり0.005ドルであることから、24時間365日利用すると年間43.8ドルとなり日本円で6,570円(為替150円/ドルの場合)の費用がかかるので、個人には痛い出費に。。。
2.想定読者
- AWS初心者(コンソールからEC2インスタンスを立ち上げることができる)
- ネットワーク初心者(IPv6についての最低限の理解がある)
- サーバ初心者(SSHでログインができる)
3.環境
- 2023/10時点でのAWS
- GoogleのIPv6チェックサイトにて、自宅PCのインターネット接続環境がIPv6対応済みであること
4.手順
a)VPC作成
- 
VPCダッシュボードから[VPCを作成]  
- 
リソースを作成 - “作成するリソース"では[VPCなど]を選択することで、サブネットなど一括で作成できるので便利
- “名前タグ"はデフォルトでもよいし、自分の好きな文字列にしてもよい
- “IPv4 CIDRブロック"はデフォルトでもよいし、利用予定のサブネットを設定してもよい
- “IPv6 CIDRブロック"は[Amazon 提供のIPv6 CIDRブロック]を選択
  - “アベイラビリティゾーン (AZ) の数"は1にする(検証で使うだけなので)
- “パブリックサブネットの数"は1にする(検証で使うだけなので)
- “プライベートサブネットの数"は0にする(検証で使うだけなので)
- “VPC エンドポイント"は0にすることにより、EC2とインターネットの通信がIPv6であることを確実に確認する
  - [VPCを作成]を実行後、右下の[VPCを表示]
  
b)サブネットの確認
- 
Subnetsメニューから作成したサブネットを選択  
- 
各設定状況を確認 - “IPv6 CIDR"が割り当てられていることを確認
- “パブリック IPv4 アドレスを自動割り当て"が[いいえ]であることを確認
  
c)ルートテーブルの確認
- 
Route tablesメニューから作成した経路情報を選択  
- 
“ルート"タブで経路設定の内容を確認 - IPv6のデフォルトルート(送信先が::/0の行)のターゲットがInternet Gateway(igw-で始まる)になっていること
  
d)インターネットゲートウェイの確認
- 
Internet Gatewayメニューにて、今回作成したインターネットゲートウェイを選択 - 今回作成したVPCに[Attached]となっていることを確認
  
e)セキュリティグループの作成
IPv6でEC2に対してSSH接続を許可するセキュリティグループを作成します。
- 
VPCダッシュボードの"Security groups"メニューを開き、[セキュリティグループを作成]  
- 
セキュリティグループ名と説明、適用するVPCを指定  
- 
インバウンドルール編集 ここでは「IPv6のすべてのICMP」とIPv6のSSHを許可します。IPv6のSSHではソースを指定するのですが、ここでIPv6の落とし穴があります。一時IPv6アドレスを指定してしまうと、後で接続できなくなりますのでご注意ください。  
- 
アウトバウンドルール ここはすべて許可します。なおIPv6 Onlyですので、EC2からインターネットへの通信において、インターネット側のサーバもIPv6対応している必要があります。IPv4では通信できません。  
- 
セキュリティグループを作成  
- 
セキュリティグループ確認 作成したセキュリティグループの内容が間違いないことを確認します。  
f)EC2インスタンスの起動
今回作成したVPCにEC2インスタンスを立ち上げます。
- 
EC2ダッシュボードのインスタンスメニュー  
- 
任意の名前でAmazonLinxu2023を作成  
- 
インスタンスタイプは無料枠のt2.micro、キーペアはテスト用に作成しておいたものを使います  
- 
ネットワーク設定は「編集」から赤枠のように、今回作成したVPC/サブネット/セキュリティグループを割り当てます。 ※「パブリックIPの自動割り当て」は必ず無効化します   
- 
ストレージやインスタンス数は任意の値を指定します  
- 
インスタンス起動待ちです  
- 
起動後にIPv6アドレスを確認します  
g)接続確認
TeratermからEC2にIPv6で接続してみます。TeratermでIPv6を使う場合は [ ] でIPv6アドレスを囲む必要があります。
- 
IPアドレス入力  
- 
鍵ファイルを指定  
- 
ログイン成功を確認  
UbuntuからEC2にIPv6で接続してみます。秘密鍵ファイルはopenssh形式に変換したものを使います。
  ```
  $ ssh -i aws-mykey-ed25519_openssh.ppk ec2-user@2406:da14:df6:a400:b018:c9a2:83f6:8342
    ,     #_
    ~\_  ####_        Amazon Linux 2023
    ~~  \_#####\
    ~~     \###|
    ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
    ~~       V~' '->
      ~~~         /
        ~~._.   _/
          _/ _/
        _/m/'
  Last login: Fri Oct 27 04:19:22 2023 from 240d:1a:4f6:c400:a560:c6cc:4998:fb0f
  [ec2-user@ip-10-0-2-199 ~]$
  ```
無事に接続することができました。セキュリティグループでhttpやhttpsを許可することで、Webページの公開も可能です。
5.デメリット
IPv6 OnlyでEC2を構築したものの、EC2から外部への通信にかなり大きい制約(※)が出てしまうことがわかりました。
なので、結論としてはIPv4とIPv6のデュアルスタック構成の方が現実的であると思いました。
※)接続先のインターネットサーバ(サービス)がIPv6対応していないと通信できない
