AWS EC2をIPv6のみ(パブリックIPv4アドレスなし)で作ってssh接続する

2024年2月よりAWSのパブリックIPv4アドレスが有料になるということなので、パブリックIPv4アドレスを付与しないEC2インスタンスを作ろうと思います。
参考: [パブリック IPv4 アドレスの利用に対する新しい料金体系](https://aws.amazon.com/jp/blogs/news/new-aws-public-ipv4-address-charge-public-ip-insights/)

# EC2インスタンスの作成
## VPCの設定
### 新規作成の場合
IPv4(ローカルIP)とIPv6の両方を設定します。
IPv6は『Amazon提供のIPv6 CIDRブロック』を選択すれば、Amazonが付与してくれます。
![スクリーンショット 2023-12-08 9.50.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/eb78052c-93e4-447a-99db-10e6602738cc.png)

### 既存のVPCにIPv6を追加したい場合
対象のVPCを選択し、アクション＞CIDRの編集 で『新しいIPv6 CIDRを追加』ボタンを押して、新規の場合と同様に設定します。
![スクリーンショット 2023-12-08 9.57.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/f4156962-250b-0004-cafb-18c81136611d.png)

## サブネットの設定
### 新規作成の場合
サブネットもIPv6を設定します。
![スクリーンショット 2023-12-08 10.06.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/092003f0-a662-f4d5-6925-faa87ce15140.png)
IPv6 subnet CIDR block の末尾の『/64』は環境に合わせて変えてください。

### 既存のサブネットにIPv6を追加したい場合
対象のサブネットを選択し、アクション＞IPv6 CIDRの編集 で『IPv6 CIDRを追加』ボタンを押して、新規の場合と同様に設定します。
![スクリーンショット 2023-12-08 10.27.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/8404c402-7b40-f299-f2fa-f162df71cb49.png)

## EC2インスタンスの設定
### 新規作成の場合
IPv6が設定されているサブネットを選択すると、『IPv6 IPを自動で割り当てる』という項目が出てくるので、『有効化』を選択します。(サブネットにIPv6が設定されていないと出ません)
パブリックIPの自動割り当ては『無効化』を選択します。
![スクリーンショット 2023-12-08 10.36.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/045c763d-f2e2-3f45-bca8-e1ba990fd0fa.png)

### 既存のEC2インスタンスにIPv6を追加したい場合
対象のEC2インスタンスを選択し、アクション＞ネットワーキング＞IPアドレスの管理 で『▶eth0: eni-〜』と書かれているところを押すと設定エリアが出るので、IPv6アドレスの『新しいIPアドレスの割り当て』ボタンを押して、空欄(自動割り当て)のまま保存します。
![スクリーンショット 2023-12-08 10.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/062416b0-5429-eaab-ae26-104bb2e7e7e5.png)

# 接続設定
さて、EC2インスタンスはできましたが、パブリックIPv4アドレスがないので、sshでIPv4アドレスを指定して接続できませんね。(自分の環境がIPv6に対応してるなら、セキュリティグループで自分のIPv6アドレスからのssh接続を許可等すれば、EC2インスタンスのIPv6アドレスで接続できるかもしれませんが、今回はやりません。)
そこで、EC2 Instance Connect Endpointを設定して接続できるように設定します。
参考: [EC2 Instance Connect Endpoint を使用した、パブリック IPv4 アドレスを必要としないインスタンスへの接続](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-with-ec2-instance-connect-endpoint.html)

## EC2 Instance Connect Endpointの設定
### セキュリティグループの設定
#### EC2 Instance Connect Endpoint用のセキュリティグループを作る
(test_ec2-connect-endpointとします)
インバウンドルールはなしのままにします。
アウトバウンドルールは、デフォルトで設定されている
* すべてのトラフィック 0.0.0.0/0
* すべてのトラフィック ::/0

は削除し、SSHを追加します。送信先には、上記で作成したEC2インスタンスが対象となるようなCIDRブロックかセキュリティグループを設定してください。
#### EC2インスタンス用のセキュリティグループを作る
(test_ec2-connectとします)
インバウンドルールにSSHを追加し、ソースに先程作ったセキュリティグループ test_ec2-connect-endpoint を設定します。
アウトバウンドルールはデフォルトのままにします。

作成したら、EC2インスタンスを選択し、アクション＞セキュリティ＞セキュリティグループを変更 でtest_ec2-connectを追加してください。

### エンドポイントの作成
[EC2 Instance Connect Endpoint の作成](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/create-ec2-instance-connect-endpoints.html#create-eice)を参考にエンドポイントを作成します。
セキュリティグループには、先程作ったtest_ec2-connect-endpointを設定します。

## AWS CLIで接続する
ローカルでawsコマンドが使えるようにしておいてください。(AWS CLIの設定については割愛)
AWS CLIは新しいものでないと対応していないので、最新バージョンにしておいた方が良いかもしれません。
```
aws ec2-instance-connect ssh --instance-id i-xxxxxxxx
```
でssh接続します。(i-xxxxxxxxには、対象のEC2インスタンスのインスタンスIDを入れてください.)

Macの場合は、.ssh/config に
```
Host *.eic
  User ec2-user
  ProxyCommand aws ec2-instance-connect open-tunnel --instance-id %h
Host test_ec2.eic
  Hostname i-xxxxxxxx
  IdentityFile ~/.ssh/EC2を作成した時に設定したキーペアの鍵ファイル
```
のように設定しておけば、
```
ssh test_ec2.eic
```
で接続できるようになります。

## インターネットゲートウェイの設定
EC2インスタンスから外へアクセスするためには、インターネットゲートウェイを設定する必要がありますが、外向きだけできれば良いのであれば、[Egress-Only インターネットゲートウェイ](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/egress-only-internet-gateway.html)を設定すれば良いと思います。
Egress-Only インターネットゲートウェイを作成し、ルートテーブルのルートの設定で、送信先『::/0』に対して作成したEgress-Only インターネットゲートウェイを設定します。

既存のEC2インスタンスにIPv6を追加した場合で、インターネットゲートウェイがすでに設定されていた場合(引き続きインターネットゲートウェイを使う場合)は、インターネットゲートウェイのルートを設定しているルートテーブルの『ルートを編集』で、送信先『::/0』に対しても『0.0.0.0/0』と同じインターネットゲートウェイを設定すると、IPv6でもアクセスできるようになります。

# その後の設定
https://qiita.com/ran/items/a6c1f79cd48c26643cda

https://qiita.com/ran/items/a23afac387375d71efd0