【AWS】VPCとEC2を作成してインターネットへ接続してみる

## 概要
- SAAの勉強をしていたが、知識ばかりで手を動かしてないなと思ったため実際にVPCとEC2を作成して、EC2からインターネットへの接続を行ってみる

### やることとゴール
- VPCを作成
- 作成したVPC内にパブリックサブネットとプライベートサブネットを作成
- インターネットGWとNATゲートウェイをアタッチしルートテーブルを作成
- パブリックサブネット内とプライベートサブネット内それぞれに1台ずつEC2を作成
- それぞれのEC2からインターネットへ接続(pingが通る)できることを目標とする

### 構成図
- 下記の構成となるよう進めていく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/3d5d324d-6318-2786-f84f-6031c3618e29.png)

## VPC作成
- 新たにVPCを1つ作成する
- 同時にパブリックサブネットとプライベートサブネット、インターネットGW、NATゲートウェイも作成しVPCへアタッチする
- それぞれのサブネットのルートテーブルを作成する

### 手順
- IAMでマネジメントコンソールへログイン
- VPCを選択
- VPCを作成を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/d4b89084-fb02-8d06-1066-096ad5855f83.png)

- VPCの設定は下記の通り

| 項目 | 値 |
|:-|:-|
| 作成するリソース  | VPCなど  |
| 名前タグの自動生成  | 自動生成  |
| IPv4 CIDRブロック  | 10.0.0.0/16  |
| IPv6 CIDRブロック  | なし  |
| テナンシー  | デフォルト  |
| アベイラビリティゾーンの数  | 1  |
| パブリックサブネットの数  | 1  |
| プライベートサブネットの数  | 1  |
| NATゲートウェイ  | 1 AZ内  |
| VPCエンドポイント  | S3ゲートウェイ (これはなしでもよかったかも)  |
| DNSオプション  | どちらもチェック  |

- 以下、参考としてキャプチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/d93dcad9-1d89-ec72-a8c3-04999a41ffc9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/d62aaa5e-9d27-1def-60c2-14e2e4a59537.png)

- こんな感じでプレビュー表示もされる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/a48474e4-1ebb-561d-c32b-3fc46a6c02ad.png)

- VPCを作成ボタンを押すと作成が始まり、下記の画面になれば完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/c2119f52-bfcb-6cc0-bede-cbf2e2a01a1f.png)

- VPCダッシュボードはこんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/fa469aa2-d3e8-1868-8c54-42604e0f1f47.png)

- パブリックサブネット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/6354810c-e9a3-32d9-259a-3c24b2f8d22e.png)

- プライベートサブネット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/159da077-6dc8-8945-adbc-da6a1e4b62bc.png)

- インターネットGW

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/9827364c-1285-a80d-d97a-dc99f9de54c9.png)

## EC2作成
### パブリックサブネットに設置するインスタンス
- インスタンスを起動を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/9d97779f-41fd-a91f-200c-e89402d286ec.png)

- 下記の設定でインスタンスを作成

| 項目 | 値 |
|:-|:-|
| 名前  | yamashun-server1-pub  |
| AMI  | Ubuntu Server 22.04 LTS（x86）  |
| インスタンスタイプ  | t2.micro  |
| キーペア  | RSA、pem  |
| VPC  | 上記で作成したVPC  |
| サブネット  | 上記で作成したパブリックサブネット  |
| パブリックIPの自動割り当て  | 有効化  |
| セキュリティグループ  | 新規作成<br>(タイプ：ssh、ソースタイプ：自分のIP)  |
| ストレージ  | 8GiB、gp3  |

- 以下、参考としてキャプチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/1242e95d-21c6-9283-1270-4a862f9299e9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/3ee09d3a-ce82-f5bc-5bde-827a0ff5bd92.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/9c930a2a-a06a-db90-83d8-8b1ec690c00a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/7b388655-6380-2b7f-0ab0-c05fd43609fc.png)

- 作成ボタンを押すとインスタンスが作成される
- 起動していることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/114893f1-0de4-d302-ef9f-0675ef1d8503.png)

#### パブリックインスタンスへSSH
- pemファイルを置いているフォルダに移動し権限を変更
(これをやらないとSSHするときに権限が緩すぎるとエラーが出る)

```shell:ローカル
$ chmod 400 "yamashun-server1.pem"
```

- 権限変更が完了したらいざSSH
- ちなみに今回はAMIにUbuntuを選択しているためユーザー名を`Ubuntu`にしているが、AMIがAmazon-Linuxの場合は`ec2-user`になる

```shell:ローカル
$ ssh -i "yamashun-server1.pem" ubuntu@54.199.8.98
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 6.8.0-1015-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Tue Nov 12 15:12:55 UTC 2024

～中略～

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@ip-10-0-3-1:~$
```

- 無事にインスタンスへ接続できた
- インターネットへの疎通確認のため[www.google.com](www.google.com)にpingを飛ばしてみる

```shell:EC2(pub)
$ ping www.google.com
PING www.google.com (142.250.199.100) 56(84) bytes of data.
64 bytes from nrt13s52-in-f4.1e100.net (142.250.199.100): icmp_seq=1 ttl=58 time=2.31 ms
64 bytes from nrt13s52-in-f4.1e100.net (142.250.199.100): icmp_seq=2 ttl=58 time=2.24 ms
64 bytes from nrt13s52-in-f4.1e100.net (142.250.199.100): icmp_seq=3 ttl=58 time=2.47 ms
64 bytes from nrt13s52-in-f4.1e100.net (142.250.199.100): icmp_seq=4 ttl=58 time=2.80 ms

--- www.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 2.235/2.452/2.798/0.216 ms
```

- 無事にインターネットへの疎通確認ができたためいったんログアウト

```shell:EC2(pub)
$ exit
```

### プライベートサブネットに設置するインスタンス
- 基本的にパブリックサブネットに設置したインスタンスと同じ
- 変更点は下記

| 項目 | 値 |
|:-|:-|
| 名前  | yamashun-server1-pri  |
| サブネット  | 上記で作成したプライベートサブネット  |
| パブリックIPの自動割り当て  | 無効化  |
| セキュリティグループ(ソース) ※  | Anywhere-IPv4  |

※後ほど変更するので作成時はいったん既存のセキュリティグループにしてしまってもOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/7f2bf535-0f62-831b-1263-bda7b057d0ce.png)

- 作成ボタンを押すとインスタンスが作成される
- 合計2台のインスタンスが動いていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/17cc64f5-2e0c-2188-d596-b6733e0444f0.png)

#### プライベートインスタンスにSSH
- プライベートインスタンスにはパブリックIPがないため、パブリックインスタンスを踏み台にしてSSHする
- まずは、キーファイルである`yamashun-server1.pem`をパブリックインスタンスの`./tmp`ディレクトリにコピーする
    - 先にインスタンス側で`tmp`ディレクトリを作成しておくといいかも
    - `scp`するときに`Permission denied`が何度か出て躓いたので、インスタンス側の`tmp`ディレクトリの権限を一時的に上げておくかユーザーを変更するかなどしておくといいかも。。。

```shell:ローカル
$ scp -i "yamashun-server1.pem" yamashun-server1.pem ubuntu@54.95.10.191:./tmp
yamashun-server1.pem                                     100% 1674   252.4KB/s   00:00
```

- パブリックインスタンスに再度接続すると、無事に`./tmp`ディレクトリにキーファイルがコピーされていることを確認できた

```shell:EC2(pub)
$ ls ./tmp/
yamashun-server1.pem
```

- 次にプライベートインスタンスがパブリックインスタンスからのSSHを許可するためにセキュリティグループを変更する
- ソースをAnywhere-IPv4(0.0.0.0)に変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757184/37bcb23a-33c5-d10a-37f3-60b8eea41e05.png)

- 準備が整ったためいざSSH
- まずはパブリックインスタンスへ接続

```shell:ローカル
$ ssh -i "yamashun-server1.pem" ubuntu@54.95.10.191
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 6.8.0-1015-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

～中略～

Last login: Wed Nov 13 14:23:46 2024 from 60.147.206.215
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@ip-10-0-3-1:~$
```

- 次にパブリックインスタンスの`./tmp`ディレクトリへ移動し、そこからプライベートインスタンスへSSHすると無事に接続することができた

```shell:EC2(pub)
$ cd tmp/
$ ssh -i "yamashun-server1.pem" ubuntu@10.0.143.9
The authenticity of host '10.0.143.9 (10.0.143.9)' can't be established.
ED25519 key fingerprint is SHA256:Pv700B6Tj3iYVVQXrmvcnrRFqiSJlZj59RPJRAmUtck.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.143.9' (ED25519) to the list of known hosts.
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 6.8.0-1015-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Wed Nov 13 14:40:50 UTC 2024

  System load:  0.0               Processes:             101
  Usage of /:   23.1% of 7.57GB   Users logged in:       0
  Memory usage: 20%               IPv4 address for eth0: 10.0.143.9
  Swap usage:   0%

～中略～

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@ip-10-0-143-9:~$
```

- 無事にプライベートインスタンスへ入れたので、インターネットへの疎通確認も行う
- NATゲートウェイがアタッチされているためプライベートインスタンスからもインターネットへの接続は可能なはず
- pingを飛ばしてみる

```shell:EC2(pri)
$ ping www.google.com
PING www.google.com (172.217.26.228) 56(84) bytes of data.
64 bytes from nrt12s51-in-f4.1e100.net (172.217.26.228): icmp_seq=1 ttl=116 time=1.74 ms
64 bytes from bom05s09-in-f4.1e100.net (172.217.26.228): icmp_seq=2 ttl=116 time=1.42 ms
64 bytes from bom05s09-in-f4.1e100.net (172.217.26.228): icmp_seq=3 ttl=116 time=2.16 ms
64 bytes from nrt12s51-in-f4.1e100.net (172.217.26.228): icmp_seq=4 ttl=116 time=1.61 ms

--- www.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.419/1.730/2.161/0.272 ms
```

- 無事に接続できたことを確認
- これで、VPCを作成してEC2からインターネットへ接続可能な環境の構築が完了した

## まとめ
- SAAを勉強している割に全然ハンズオンしたことがなく頭でっかちになっていたが、VPCの作成を行うことで解像度は間違いなく上がったと感じる
(EC2は以前何度か作ったことはあった)
- この調子で色々なサービスを触っていきたい
- 次はLambdaかコンテナあたりかなぁ

## 参考にしたサイト

https://qiita.com/zeems/items/1d97d42a99936885ca4a

https://qiita.com/tonkatsu_oishi/items/9ffdd560624f25dc7fa9