SAAで学ぶAWS -VPC編-

AWS Solutions Architect Associate を取得する際に、VPCについて知りたいときに見るドキュメント。

## 目次

1. 概要
2. 作ってみる
3. 動作確認
4. メモ書き


## 概要

AWSのインスタンスを生成するようなサービスを利用する際に必要になる土台のネットワーク部分を作成する。
1つのアカウントで複数プロジェクトを管理する場合は、サービスごとにVPCを作ってリソースの管理をするのが望ましいそうな。

今回作るのは以下の構成。


![2cc450a4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/b2dba920-cf0c-459a-4101-85ffc5902dd8.png)


大枠のVPCの中に2種類のサブネットを合計6個作成する。

+ リージョン (ap-northeast-1)
    + VPC (saa-vpc)
        + プライベートサブネット
            + AZ a, b, c
        + パブリックサブネット
            + AZ a, b, c

サブネットはIGWへのルーティングの有無によって2種類に分解できる。

+ パブリックサブネット
    + IGWへのルーティングがあるサブネット
    + パブリックIPが付与されていればインターネットに接続できる
    + インターネットに公開されるwebサーバなどを配置する
+ プライベートサブネット
    + IGWへのルーティングがないサブネット
    + 基本的にインターネットに接続できない
    + インターネットに接続する場合はNAT GWを経由してアクセスする
    + インターネットからはアクセスされたくないDBサーバなどを配置する


これから色々構築する (予定な) ので下準備としてこんな感じのネットワークを作成する。
また、リージョンは東京リージョンに作成するのでリージョンを確認しておくこと。

![e7787dc8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/4a44ff64-b0d1-884d-4580-0f6a6f6e2a59.png)


## 作ってみる

**VPCの作成**

1. AWSにログイン後 `VPC` を検索してメニューを選択する
    ![08ccc884.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/838d2a48-7879-2f13-7412-f56d1a1c0630.png)


2. 左メニューから`VPC`を選択して`VPCの作成`を選択する
    ![a143da0b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/5e3cc5f6-b31c-417e-bb17-2c729d4eb7cf.png)


3. 名前タグに `saa-vpc` を入力する
    IPv4 CIDR ブロックに `34.0.0.0/16` を入力する
    IPv6 CIDR ブロックは今回は使わないので `IPv6 CIDR ブロックなし` を選択する
    マシンを専有する必要はないので、テナンシーは `デフォルト` を選択する
    ![33366e57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/c9058998-2f2c-9a0b-6c53-1227d0e07b46.png)


これでVPCが作成された。

> VPCフローログ
> + VPC内部のネットワークトラフィックのログをCloudWatchLogsに保存できる
> + CloudWatchLogsでログフィルタをしてLambda連携やアラートの送信も可能
> + CloudWatchLogsの料金が気になる場合はS3に直接出力してコストを抑えることも可能

次にこのVPCにインターネットゲートウェイをアタッチする。


**インターネットゲートウェイの作成**

インターネットに接続するためのIGW(**I**nternet **G**ate **W**ay)を作成、設定する。

1. 左メニューから`インターネットゲートウェイ`を選択して`インターネットゲートウェイの作成`を選択する
    ![9e48d89a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/52b0d3ab-10f9-a509-d170-d0eb251833bc.png)


1. 名前タグに `saa-vpc-igw` を入力して作成
    ![d2a5d552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/aa6bda8c-6157-51f4-2d08-e3c2ade53c4d.png)


1. IGW一覧に戻って `saa-vpc-igw` を選択 > アクション > VPCにアタッチ
    ![96bcc442.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/704d14b2-5acd-eaa6-367d-7abb7c5d97a1.png)


1.  VPCに `saa-vpc` のVPC-IDを入力 > アタッチ
    ![2d96bcd0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/a2dfd7e3-88bb-f8a6-43da-878137ae5d1f.png)


これで`saa-vpc`にIGWがアタッチされた。
次にこのVPC内にサブネットを作成する。


**サブネットの作成**

各AZにパブリックサブネットとプライベートサブネットを作成する。

1. 左メニューから`サブネット`を選択して`サブネットの作成`を選択する
    ![cff4f4e7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/1151478d-b6d0-4e33-6bd7-7e2e746b47fc.png)
1. ap-northeast-1a のパブリックサブネットを作成
    + 名前タグに `saa-pubsub-1a` を入力する
    + VPCに先程作成した `saa-vpc` のVPC-IDを入力する
    + アベイラビリティーゾーンに `ap-northeast-1a` を入力する
    + IPv4 CIDR に `34.0.10.0/24` を入力する
    ![3de8ae61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/f71ad45d-02c5-6182-e56c-bce5aad2ad5a.png)
    + サブネット一覧から `saa-pubsub-1a` を選択して アクション > 自動割り当て IP 設定の変更 を選択する
    + パブリック IPv4 アドレスの自動割り当てを有効にする をチェックして保存
1. ap-northeast-1a のプライベートサブネットを作成
    + 名前タグに `saa-prisub-1a` を入力する
    + VPCに先程作成した `saa-vpc` のVPC-IDを入力する
    + アベイラビリティーゾーンに `ap-northeast-1a` を入力する
    + IPv4 CIDR に `34.0.1.0/24` を入力する
1. 他 c, d のAZでも同じ要領で値を置き換えて作成する
    + `saa-pubsub-1c` の IPv4 CIDR : `34.0.20.0/24`
    + `saa-prisub-1c` の IPv4 CIDR : `34.0.2.0/24`
    + `saa-pubsub-1d` の IPv4 CIDR : `34.0.30.0/24`
    + `saa-prisub-1d` の IPv4 CIDR : `34.0.3.0/24`

これでサブネットが作成された。


次にNAT Gateway を作成、設定する。


**NAT Gatewayの作成、設定**

プライベートサブネットからインターネットに接続するためのNAT Gateway を作成、設定する。

1. 左メニューから`NAT ゲートウェイ`を選択して`NATゲートウェイの作成`を選択する
    ![6c4df041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/330d94c0-745d-125d-8a61-2c46e5a1fd29.png)

2. サブネットに `saa-pubsub-1a` を入力する
    Elastic IP 割り当て ID は新しいEIPの作成で自動入力してNATゲートウェイの作成
    ※ パブリックサブネットであればどこでもOK
    ![a91ddb89.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/1fe1eb63-e0a2-09f2-376d-55b40611f65c.png)

これで saa-pubsub-1a のサブネットにNATゲートウェイが作成された。
次にサブネットの種類ごとにルートテーブルを作成、設定する。


**ルートテーブルの作成**

パブリックサブネット向けのルートテーブルと、プライベートサブネット用のルートテーブルを作成する。

1. 左メニューから`ルートテーブル`を選択して`ルートテーブルの作成`を選択する
    ![cc755aa0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/abd2c6f5-8c2a-0494-6862-221e9b71ac08.png)
1. パブリックサブネット向けルートテーブルの作成、設定
    1. 名前タグに `saa-public-route-table` を入力する
    VPCに `saa-vpc` のVPC-IDを入力して作成
    ![59afc7b4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/f06b2030-9990-d2a0-5e5a-40cb2f27beb9.png)
    1. ルートテーブル一覧に戻り `saa-public-route-table` を選択 > アクション > サブネットの関連付けの編集
    ![ee54f894.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/42cb27dd-9df8-0beb-ec9e-48f6f98c23ee.png)
    1. `saa-pubsub-1a`, `saa-pubsub-1c`, `saa-pubsub-1d`を選択し保存
    ![a5d78e6b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/8a934f2e-00a3-8485-2abd-1210ebd695db.png)
    1. ルートテーブル一覧に戻り `saa-public-route-table` を選択 > アクション > ルートの編集
    ![3319088e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/aed707dd-e024-27db-e8a6-dfc0c73065c6.png)
    1. ルートの追加 > 送信先に `0.0.0.0/0` を、ターゲットに `Internet Gateway` > `saa-vpc-igw` を選択しルートの保存
    ![4689fdf2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/a53ae9d9-cfc7-c098-229d-6c53f8987020.png)
1. プライベートサブネット向けルートテーブルの作成
    1. 名前タグに `saa-private-route-table` を入力する
    VPCに `saa-vpc` のVPC-IDを入力して作成
    1. ルートテーブル一覧に戻り `saa-private-route-table` を選択 > アクション > サブネットの関連付けの編集
    1. `saa-prisub-1a`, `saa-prisub-1c`, `saa-prisub-1d`を選択し保存
    1. ルートテーブル一覧に戻り `saa-private-route-table` を選択 > アクション > ルートの編集
    1. ルートの追加 > 送信先に `0.0.0.0/0` を、ターゲットに `NAT Gateway` > 先程作成したNATゲートウェイのIDを選択しルートの保存

これでルートテーブルの作成、設定が完了した。


## 動作確認

想定した動作になっているか確認する。

+ 想定
    + パブリックサブネットのインスタンス
        + パブリックIPでアクセスできること
        + インターネットに接続できること
        + プライベートサブネットのインスタンスにアクセスできること
    + プライベートサブネットのインスタンス
        + NAT GateWay 経由でインターネットにアクセスできること

こんな感じで試してみる。
![f77e7c7f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/58de3755-7f86-87a6-c172-719830cb3ee5.png)


**インスタンスの作成**

1. saa-pubsub-1c にインスタンスを作成する
    1. `EC2`を検索してメニューを選択し左メニューから`インスタンス`を選択して`インスタンスの作成`を選択する
    ![15ce4f5a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/c3d26b67-d2c1-546f-0b05-9e8814e5b155.png)
    2. Amazon マシンイメージに `Amazon Linux 2 AMI (HVM), SSD Volume Type` を選択する
    ![827b0671.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/b9a32b52-17f2-db68-a9df-594123ce7177.png)
    3. インスタンスタイプに `t2.micro` を選択する
    ![b30b2c16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/f3cb046a-adfc-5f1c-99aa-16b4f2703dfb.png)
    4. インスタンスの詳細のネットワークに `saa-vpc` を入力する
    サブネットに `saa-pubsub-1c` を入力する
    その他はデフォルトで次のステップへ進む
    ![c3918be9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/544f62f6-7100-3df8-cf52-5595d3eefb0e.png)
    6. ストレージはデフォルトで次のステップへ進む
    7. タグに キー:`Name` 値:`pub-c` を入力し次のステップへ進む
    ![6523faf5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/d3394bf8-449d-7fc9-73b9-cb4f7f184338.png)
    8. セキュリティグループ名に `saa-ec2-web` を入力する
    ![ff7fecbe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/47edc768-c4c7-e27d-9d66-c9d43399f03b.png)
    9. 内容を確認して起動し、`新しいキーペアの作成` キーペア名`saa-keypair` を入力しダウンロードする
    ※ キーペアはとても大切なものなのでなくさないこと！！
    ![dfda2388.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/cae4da13-cc7a-f4d0-7a2e-726576564bb8.png)
2. saa-prisub-1c にインスタンスを作成する
    1. `pub-c` と同様に作成する。ただし、サブネットは `saa-prisub-1c` でタグは `Name`:`pri-c` に置き換えて作成する

これでEC2インスタンスが作成できた。


**接続の確認**

`pri-c` はそもそもパブリックIPがないのでアクセスできない。
まずは `pub-c` にアクセスして、そこ経由で `pri-c` にアクセスできることを確認する。
`pub-c` のパブリックIPアドレスを確認しておく。
![7c58eb8c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/20eb7833-0847-8a31-3043-1feb7c58eb8c.png)

`pri-c` に接続するために `pub-c` に鍵を送信しておく。
コマンドラインから以下を実行する。

```bash
# pub-c のIPアドレスを設定する
PUBC=<pub-cのパブリックIPアドレス>

# キーペアの鍵を pub-c に転送する
scp -i ./saa-keypair.pem ./saa-keypair.pem  ec2-user@$PUBC:/home/ec2-user/

# pub-c に接続する
ssh -i ./saa-keypair.pem -l ec2-user $PUBC
```

接続できたら `pub-c` からインターネットに接続できることを確認してみる。

```
# Google のページにアクセスしてみる
curl www.google.co.jp
```

アクセスできたら `pri-c` に接続できることを確認するために `pri-c` のIPアドレスを確認する。
![7c58eb8c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/f14d8109-f628-7332-74b6-7e3dc6fd2c31.png)

`pub-c` から `pri-c` に接続する。

```
# pri-c のIPアドレスを環境変数に設定する
PRIC=<pri-cのIPアドレス>

# pri-c へ接続する
ssh -i ./saa-keypair.pem ec2-user@$PRIC
```

接続できた。次にNATゲートウェイ経由でインターネットに接続できることを確認する。

```
# pri-c から Google のページにアクセスしてみる
curl www.google.co.jp
```

接続できた。

これで図の構成の構築が完了した。
課金が発生してしまうので、不要なインスタンスやNAT Gatewayは削除しましょう。

お疲れ様でした！