この記事は、ハンズラボ Advent Calendar 2018 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できる環境を作ります。
以下のGitHubリポジトリで今回作成する環境のCloudFormationテンプレートを公開しています。
VPC,SubnetをCloudFormationでどうやって作るか参考にしたいひとはこちらもご覧ください。
なお、本環境はOregon(us-west-2)リージョンで構築することを前提としています。
構築手順
1. VPCを作成する


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




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


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


5. パブリック用RouteTableにInternetGatewayのルートを追加する
パブリック用RouteTableにInternetGatewayのルートを追加します。
Destinationの 0.0.0.0/0
はAWSの記法で、全てのIPアドレスを表します。
今回の場合、 10.26.0.0/16
の範囲でない全てのIPアドレスへのアクセスをInternetGatewayの方へルーティングしてインターネットに接続できるようにしています。


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


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


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


9. 作成しておいたElasticIPを利用して、NatGatewayを作成する
NatGateway自身はインターネットに接続可能にする必要があるため、パブリックSubnetに作成します。


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


11. プライベート用RouteTableにNatGatewayのルートを追加する
プライベート用RouteTableにNatGatewayのルートを追加します。
この場合、 10.26.0.0/16
の範囲でないIPアドレスへのアクセスをNatGatewayの方へルーティングして、
NatGatewayを経由してインターネットに接続できるようにしています。
NatGatewayを経由するプライベートSubnetの場合、インターネットからEC2へアクセスすることはできません。
あくまでEC2からインターネットへのアクセスを可能にしています。


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


13. パブリックSubnetにCloud9を作成する
ブラウザでシェルが使える環境として、Cloud9を作成します。



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



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







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

キーペアは新しく作成するか、既存のものを使用してください。
お疲れ様でした。ここまでの手順で、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を確認します。

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

SecurityGroupに穴を開ける
Cloud9からEC2へPingできるように、SecurityGroupの穴をあけましょう。
接続の許可はインバウンドルールで設定します。

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

Cloud9からEC2の疎通確認(つながる)
再度、パブリックSubnetのCloud9からプライベートSubnetのEC2へ接続確認してみましょう。
Cloud9からEC2へPingしてみるとつながっていることがわかります。

おわりに
SecurityGroupのプロトコルをTCP、ポート22で設定すればSSHの接続のみ許可したりすることもできます。
ポート80にすればhttpの接続のみ許可することもできます。
ソースを設定することで特定のグローバルIPからのみアクセスを許可するなんてこともできます。
EC2と合わせて、VPC周りのネットワークも是非理解してみてください。
世界が広がります。
ハンズラボ Advent Calendar 2018 明日15日目は、@sho-hitomiです!