AWS Public-Private構築の基礎訓練

#急遽構築したAWSシステムのせいで、俺の体はボロボロだ！
AWS提案時に、社内やお客様への説明用にまとめたページが欲しかったので執筆。

#これ作ってもいいかな？
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/809565b8-bc7f-1f72-8948-cf3717939139.jpeg)
おためしで作ったので、実用性があるかは置いておいて。
・**EC2-WEB**にコンテンツ本体があり、Private Subnetに配置。route tableはNAT Gatewayを指定。
・**EC2-bation**はSecurity groupでソース元IPを指定して、社内からしかSSHが出来ないように設定。
　route tableはInternet gatewayを指定するので、Public Subnet1に配置。
・**NAT Gateway**はPublic Subnet2に配置。
・**Application Load Balancer(以下ALB)**は、Availability zone(以下AZ)aのPublic Subnet1と
　AZ-dのPublic Subnet2に跨り、EC2-WEBが所属しているターゲットグループを持つ。

#クラスBか、面白い。
~~何が面白いのか分からない~~
適当にVPCとインターネットゲートウェイ(IGW)を作る。
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/11742dfe-5ba8-f5a7-d46c-015181c40021.jpeg)
![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/14c30ee7-b112-c4f8-3eba-fe8d82461ca9.jpeg)
###ここまでの図
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/7bc917b2-be96-8236-0ab0-832198b92848.jpeg)

#３！
適当にサブネットを3つ作る。
![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/e14007b6-ab73-f8e4-8f65-b596153ae0fd.jpeg)
ルートテーブルも適当に3つ作る。
![7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/aebb3ef4-2eca-6381-8ebb-86620a5d2877.jpeg)
その後、ルートの編集でPublic Subnet1とPublic Subnet2のルートにターゲットをIGWで指定してデフォルトゲートウェイを追加する。
![8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/6b596ebf-21f6-f170-0cef-c9ff55612756.jpeg)
**ルートテーブルのルートにIGWがターゲットで指定されていないサブネット=Private Subnet**
IGWがルートについてるのにPrivate Subnetとか、Private Subnetって書いてながら直接IGWを抜けるような図は間違っているので咎めていく。
###ここまでの図
![9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/d09b69d1-6144-0f7e-ad47-a5e4b65099bb.jpeg)
#その踏み台を利用されないようにしろ
適当に踏み台(EC2-bation)とコンテンツ(EC2-WEB)のインスタンスを作成する。

踏み台インスタンスの方は、限られたIPからしか入られないようにセキュリティグループを設定する。
プロトコルもSSHのみに。
![12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/dabed264-4fef-6695-bcbb-4a46e3a81430.jpeg)
EC2-WEBの方は、EC2-bationからしかSSHが出来ないようにセキュリティグループを設定する。
![13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/bc37c726-4535-2c3f-cad3-9374bdc62177.jpeg)
無事入れることを確認。
![14.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/f9be816d-ac61-a801-710c-70d08c470f5b.jpeg)
###ここまでの図
![11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/3d94f7c0-daf3-2211-94eb-257ac6523b8d.jpeg)
#無通信　俺のホストに　無通信
堅牢な構成のAWSが出来て喜んだのも束の間、このままだとEC2-WEBはPINGもyum updateも出来ない悲しいインスタンスとなる。
![15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/7a9545bf-2318-80af-9c3a-f5cbf0d9e347.jpeg)
次項では、**インターネットから誰かに疎通はされたくない**けど、**インターネットへ一方的に疎通はしたい**という恋する乙女のような設定をしていく。
#見たか！？NATゲートウェイだ！！
適当にNATゲートウェイを作る。
これはVPCサービスの一つで、AWSフルマネージドのNATサービス。
保守とか冗長性も全部AWSが担保しているので便利。
![16.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/c109e07b-f0e8-b20b-23ce-b47aa68a9c29.jpeg)
Private Subnetのルートのデフォルトゲートウェイに、NATゲートウェイをターゲットする。
![17.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/dbdea4d6-c971-d39d-d101-c4978a5f96c9.jpeg)
これでEC2-WEBからNATゲートウェイを介して一方的にインターネットへ疎通ができる。
PINGも飛ばし放題。(良い子は-c5を入れようね)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/6e185003-8748-edf7-9619-67e9a5bc92d9.png)
###ここまでの図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/4d271308-1058-47d7-8a52-3a69c22032dc.png)
#このNATなら、セッションは張れないな！
そう、このNATゲートウェイだけだとインターネットには出れるけれども、
インターネットからEC2-WEBへアクセスすることができない。
(NATに割り振られているEIPにアクセスしても"ERR_CONNECTION_TIMED_OUT"と返される)

普通はEC2-WEBにあたるインスタンスにグローバルIPを付けてあげれば済む話なんだけど、
Private Subnetに配置したいという要望があった場合、**Elastic Load Balancingを使う。**
※今回はHTTPしかしないので、ALBを選択。

まず、ターゲットグループを適当に作る。
![18.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/57076431-4fb8-afd7-68dd-f87ff9516263.jpeg)
適当にEC2-WEBをターゲットにする。
![19.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/ab12475e-9091-215c-4915-241a58653be9.jpeg)

適当にALBを作る。
Private Subnetを指定すると「IGW付いてないよ？大丈夫？」と聞いてくるが「うるせえ!!!いこう!!!(ドン」で進む。
![21.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/bd2b4945-2139-52ff-d910-c2c146594c06.jpeg)
セキュリティグループはとりあえずどこからでもHTTPが受け取れるようにする。
![20.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/2e629032-9871-a2a9-ab07-78b9c3cf1d7d.jpeg)
ターゲットグループは前述で作成したものを指定。

最後に、EC2-WEBのセキュリティグループにHTTPをALBのセキュリティグループからのみ許可するとしてあげれば完成。
![23.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/335d26aa-8446-433e-d165-5b1a4ef4dd90.jpeg)

とりあえずALBのDNS直叩きすると、EC2-WEBで作成したコンテンツが表示されるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/57aa4560-c8ce-51de-b4e4-0eda43950612.png)

###完成図
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/a47a9823-ec42-b474-1203-b9aa2a3bfb1a.jpeg)


#やはりそういうことか！
これでEC2-WEBからインターネットへ抜ける場合は、[EC2-WEB]→[NAT]→[IGW]という経路、
外部からインターネットでEC2-WEBへアクセスする場合は、[IGW]→[ALB]→[EC2-WEB]、
という経路が確立された。

Private Subnetにインスタンスを配置することを要望された場合、どの経路のインターネット接続が必要かお客様にヒアリングすることが大事であることを再認識できた。

ちなみに、技術的にさらに詳しく書かれた記事は以下があります。

□【図解/AWS】インターネットGWとNAT-GWの違い〜各メリット、パブリックサブネットとは〜
https://milestone-of-se.nesuke.com/sv-advanced/aws/internet-nat-gateway/

上記記事を見たら、このqiita見る必要無かっただろうとか、時間の無駄やんけと思われる方が居るかもしれない。

君の時間を無駄にしたのは私の責任だ。だが私は謝らない。
その憤りを糧にして、必ずAWSを布教してくれると信じているからな。