AWSのVPC,Subnet,SecurityGroupを一通り構築して理解しよう

この記事は、[ハンズラボ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/handslab) 14日目の記事です。

## はじめに

AWSでEC2を利用してみたいけど、VPCをどうやって作ったら良いかわからない！
そんな人向けにAWS VPC社内勉強会を開催したので、解説記事を書こうと思います。

ただEC2を立てるだけならデフォルトVPC、デフォルトSubnetを使えば良いのですが、
せっかくなのでVPCの作り方も覚えましょう。ネットワークの世界が広がります。

この記事のレベル感としては、読者が以下の事ができるようになることを目標しています。

- パブリックサブネットとプライベートサブネットの違いがわかり、構築ができる
- 異なるサブネットにあるEC2からEC2にPingできる環境が構築できる

また、以下内容については本記事では解説しないため、理解できていることを前提にお話しいたします。

- ネットワークアドレス、ホストアドレス、サブネットマスクが何となくわかる。
-  `192.168.10.0/24` のような記法が理解できる。（上位24ビットがネットワークアドレスであることがわかる）
- Pingコマンドの使い方がわかる。
- EC2のキーペアを作成することができる。


## AWS構成図

今回は下図のようなAWS環境を構成します。 

パブリックSubnetにある `EC2(Cloud9)` から プライベートSubnetにある `EC2` へPingできる環境を作ります。

![AWS](https://github.com/rednes/aws-vpc-sample/blob/master/img/aws.png?raw=true)

以下のGitHubリポジトリで今回作成する環境のCloudFormationテンプレートを公開しています。
VPC,SubnetをCloudFormationでどうやって作るか参考にしたいひとはこちらもご覧ください。

https://github.com/rednes/aws-vpc-sample

なお、本環境はOregon(us-west-2)リージョンで構築することを前提としています。


## 構築手順

### 1. VPCを作成する

<img width="935" alt="vpcs | VPC Management Console_2018-12-11_19-47-07.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/66f4cc2d-bf9d-3172-81c9-ae668daf5560.png">

---

<img width="924" alt="Create VPC | VPC Management Console_2018-12-11_19-41-06.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/cd863996-8232-8be7-428d-34f4b29f65c2.png">

### 2. InternetGatewayを作成してVPCにアタッチする

パブリックSubnet内のEC2がインターネットに接続できるよう、InternetGatewayを作成します。

<img width="937" alt="インターネットゲートウェイ | VPC Management Console_2018-12-11_19-48-16.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/0c7b5640-2066-3bc7-74a6-4ac8a0e5b80f.png">

---

<img width="932" alt="インターネットゲートウェイの作成 | VPC Management Console_2018-12-11_19-49-09.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/088b828a-bd7b-348d-1e05-2c21779e9fbe.png">

---

<img width="920" alt="インターネットゲートウェイ | VPC Management Console_2018-12-11_19-50-57.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/0f892074-a22d-055e-b4da-0f0b9d1072df.png">

---

<img width="921" alt="VPC にアタッチ | VPC Management Console_2018-12-11_19-52-40.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/854ccc71-9eda-7433-257c-3b5d2e53e2b7.png">


### 3. パブリックSubnetを作成する

<img width="932" alt="サブネット | VPC Management Console_2018-12-11_19-55-18.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/5a6c677a-0f78-bd20-4df0-cd78a3a19e5c.png">

---

<img width="922" alt="サブネットの作成 | VPC Management Console_2018-12-11_19-57-21.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/2843cfd2-3b2d-0dc6-0015-85dd7fc656c1.png">

### 4. パブリック用RouteTableを作成する

<img width="929" alt="Route Tables | VPC Management Console_2018-12-11_19-59-47.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/908b2858-fe61-62de-78b9-be745c1f0da2.png">

---

<img width="927" alt="Create route table | VPC Management Console_2018-12-11_20-00-31.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/75cde621-7583-8cf6-0553-6b8374a22eaf.png">

### 5. パブリック用RouteTableにInternetGatewayのルートを追加する

パブリック用RouteTableにInternetGatewayのルートを追加します。
Destinationの `0.0.0.0/0` はAWSの記法で、全てのIPアドレスを表します。

今回の場合、 `10.26.0.0/16` の範囲でない全てのIPアドレスへのアクセスをInternetGatewayの方へルーティングしてインターネットに接続できるようにしています。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html

<img width="932" alt="Route Tables | VPC Management Console_2018-12-11_20-02-42.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/8f65ef23-3af7-69cf-e872-216855c53c86.png">

---

<img width="916" alt="Edit routes | VPC Management Console_2018-12-11_20-03-32.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/a087301c-8488-5616-cb4d-11a5073c189c.png">

### 6. パブリック用RouteTableにパブリックSubnetを関連付けする

<img width="924" alt="Route Tables | VPC Management Console_2018-12-11_20-06-18.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/aa8ce41c-63e1-f38b-17c5-98a17cbc8d40.png">

---

<img width="913" alt="Edit subnet associations | VPC Management Console_2018-12-11_20-07-07.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/74539e58-ccbe-57e2-be6d-6478ced68a9b.png">

### 7. プライベートSubentを作成する(Availability Zone: a)

<img width="932" alt="サブネット | VPC Management Console_2018-12-11_19-55-18.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/5a6c677a-0f78-bd20-4df0-cd78a3a19e5c.png">

---

<img width="911" alt="サブネットの作成 | VPC Management Console_2018-12-12_09-08-45.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/cd3d23cf-d33d-5eca-a9ec-8d07df2d0209.png">

### 8. NatGateway用のElasticIPを作成する

プライベートSubnetにEC2を作る場合でも、 `yum update` したい等の理由でEC2からインターネットへ接続したい場合があります。
そういう場合は、NatGatewayを使用します。

<img width="939" alt="Elastic IP | VPC Management Console_2018-12-12_09-10-37.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/90442bde-0752-df4f-b40d-054437efb66e.png">

---

<img width="915" alt="新しいアドレスの割り当て | VPC Management Console_2018-12-12_09-11-18.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/ab7f78e3-120a-06be-02f7-e115df6e279d.png">

### 9. 作成しておいたElasticIPを利用して、NatGatewayを作成する

NatGateway自身はインターネットに接続可能にする必要があるため、パブリックSubnetに作成します。

<img width="948" alt="NAT ゲートウェイ | VPC Management Console_2018-12-12_09-13-09.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/e30e65cb-bdb7-7b89-a108-46b5e76748b5.png">

---

<img width="932" alt="NAT ゲートウェイの作成 | VPC Management Console_2018-12-12_09-14-41.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/3b399062-3e10-35d6-b312-e8a74a65f7dc.png">

### 10. プライベート用RouteTableを作成する

<img width="929" alt="Route Tables | VPC Management Console_2018-12-11_19-59-47.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/908b2858-fe61-62de-78b9-be745c1f0da2.png">

---

<img width="919" alt="Create route table | VPC Management Console_2018-12-12_09-16-28.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/cb78742a-3122-5b59-d46c-1583852bac22.png">

### 11. プライベート用RouteTableにNatGatewayのルートを追加する

プライベート用RouteTableにNatGatewayのルートを追加します。

この場合、 `10.26.0.0/16` の範囲でないIPアドレスへのアクセスをNatGatewayの方へルーティングして、
NatGatewayを経由してインターネットに接続できるようにしています。

NatGatewayを経由するプライベートSubnetの場合、インターネットからEC2へアクセスすることはできません。
あくまでEC2からインターネットへのアクセスを可能にしています。

<img width="932" alt="Route Tables | VPC Management Console_2018-12-11_20-02-42.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/8f65ef23-3af7-69cf-e872-216855c53c86.png">

---

<img width="919" alt="Edit routes | VPC Management Console_2018-12-12_09-19-46.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/05105e75-0b91-f4f5-cfb0-243932ae4d57.png">

### 12. プライベート用RouteTableにプライベートSubnetを関連付けする

<img width="924" alt="Route Tables | VPC Management Console_2018-12-11_20-06-18.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/aa8ce41c-63e1-f38b-17c5-98a17cbc8d40.png">

---

<img width="930" alt="Edit subnet associations | VPC Management Console_2018-12-12_09-21-52.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/1fce7769-cb61-055a-20bb-78837e681bcb.png">

### 13. パブリックSubnetにCloud9を作成する

ブラウザでシェルが使える環境として、Cloud9を作成します。

<img width="751" alt="Create a new environment_2018-12-12_09-24-39.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/093ba61c-61ab-b84a-5532-c4d2939abee9.png">

---

<img width="618" alt="Create a new environment_2018-12-12_09-25-30.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/a0c10bb9-cbcf-7ec4-5b44-8a9927a6fce0.png">

---

<img width="945" alt="cloud9-for-sample - AWS Cloud9_2018-12-12_09-29-58.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/6f982c90-0459-a422-e78b-67a9b2a5c8c6.png">

### 14. EC2用のSecurityGroupを作成する

EC2用のSecurityGroupを作成します。
インバウンドの許可を全く設定していないので、どこからの接続も拒否するSecurityGroupができます。

<img width="942" alt="EC2 Management Console_2018-12-12_09-31-24.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/f40efcae-dfad-088c-844b-6d5c22f49114.png">

---

<img width="942" alt="EC2 Management Console_2018-12-12_09-31-24.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/349c824a-075f-a1a2-9f6b-bd7c8e483534.png">

---

<img width="917" alt="EC2 Management Console_2018-12-12_09-37-50.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/0a00479f-150b-a997-d23a-544b07ec37c7.png">

### 15. プライベートSubnetにEC2を作成する

<img width="928" alt="EC2 Management Console_2018-12-12_09-40-04.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/9aac9654-7c83-939c-dac4-3f10a772be67.png">

---

<img width="933" alt="EC2 Management Console_2018-12-12_09-40-44.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/c60a0486-b375-9bb9-938d-c2c0e4d96337.png">

---

<img width="941" alt="EC2 Management Console_2018-12-12_09-41-12.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/1e16a9b2-3245-c43a-4066-d9a2383af8a7.png">

---

<img width="937" alt="EC2 Management Console_2018-12-12_09-42-04.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/cd49e4a7-7241-1d46-b576-73de6d30c2d6.png">

---

<img width="938" alt="EC2 Management Console_2018-12-12_09-43-36.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/8513d1e4-b754-2b00-5add-05ddc56a73b2.png">

---

<img width="938" alt="EC2 Management Console_2018-12-12_09-44-15.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/6dcbe63d-46f2-43f4-ce70-710b2c7fd2d1.png">

---

<img width="939" alt="EC2 Management Console_2018-12-12_09-45-09.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/e2c38db6-661b-d9de-abb0-51c38780014d.png">

---

どこからの接続も拒否するSecurityGroupを設定しているので、警告がでますが無視します。

<img width="939" alt="EC2 Management Console_2018-12-12_09-46-40.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/3581c9de-da64-0c99-90a3-f267ac8e076f.png">

---

キーペアは新しく作成するか、既存のものを使用してください。

![68747470733a2f2f71696974612d696d6167652d73746f7265.png](https://qiita-image-store.s3.amazonaws.com/0/199081/afd53e20-768e-58da-c71e-af1357475133.png)


お疲れ様でした。ここまでの手順で、VPC,Subnet,SecrityGroupが一通り構築できました。


## パブリックSubnetとプライベートSubnet

ここまで構築してみて、わかった方も居ると思いますが、パブリックSubnetとプライベートSubnetの設定値的な違いはありません。（パブリックSubnetフラグ、みたいなものがあるわけではありません。）
パブリックSubnetとプライベートSubnetの違いとは、役割の違いです。

RouteTableのルーティングによって、InternetGatewayを通じてインターネットと相互通信できるSubnetを便宜上、 `パブリックSubnet` と呼んでいます。
インターネットと相互通信できない（または、NatGatewayを通じてEC2からインターネット接続のみできる）Subnetを便宜上、 `プライベートSubnet` と呼んでいます。


## Cloud9からEC2の疎通確認（つながらない）

次に、パブリックSubnetのCloud9からプライベートSubnetのEC2へ接続確認してみましょう。
EC2へ何の接続も許可しないSecurityGroupを設定しているので、当然つながりませんが、つながらないことを確認しましょう。

マネジメントコンソールから、EC2のプライベートIPを確認します。

<img width="930" alt="EC2 Management Console_2018-12-12_09-56-41.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/ba4f1f79-223c-066d-c978-62925994f882.png">

Cloud9からEC2へPingしてみますが、パケットロスで繋がりません。SecurityGroupが接続を遮断しています。

<img width="949" alt="cloud9-for-sample - AWS Cloud9_2018-12-12_09-58-06.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/0b39b1c3-8f3c-0ce2-e80c-7a95e35e6d16.png">

## SecurityGroupに穴を開ける

Cloud9からEC2へPingできるように、SecurityGroupの穴をあけましょう。

接続の許可はインバウンドルールで設定します。

<img width="932" alt="EC2 Management Console_2018-12-12_10-00-20.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/ea0a3457-790b-d407-2e9a-392c28dbae9f.png">

PingのプロトコルはICMPなので、「すべてのICMP - IPv4」を選択して許可します。
今回はソースを `0.0.0.0/0` としてどこからのアクセスも許可していますが、必要に応じて許可するIPの範囲を絞ってください。
SecurityGroupのグループIDを指定することで、特定のSecurityGroupに属するEC2からのアクセスのみ許可することもできます。

<img width="1117" alt="EC2 Management Console_2018-12-12_10-02-30.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/48ce4d31-38a5-b45d-f92e-45c3ca74824b.png">


## Cloud9からEC2の疎通確認（つながる）

再度、パブリックSubnetのCloud9からプライベートSubnetのEC2へ接続確認してみましょう。

Cloud9からEC2へPingしてみるとつながっていることがわかります。

<img width="679" alt="cloud9-for-sample - AWS Cloud9_2018-12-12_10-03-48.png" src="https://qiita-image-store.s3.amazonaws.com/0/199081/c089e761-003e-c835-3536-f827b6f87ccc.png">

## おわりに

SecurityGroupのプロトコルをTCP、ポート22で設定すればSSHの接続のみ許可したりすることもできます。
ポート80にすればhttpの接続のみ許可することもできます。
ソースを設定することで特定のグローバルIPからのみアクセスを許可するなんてこともできます。

EC2と合わせて、VPC周りのネットワークも是非理解してみてください。
世界が広がります。

[ハンズラボ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/handslab) 明日15日目は、@sho-hitomiです！