【AWS VPC入門】4.NatGateway/Bastion

# 前回までの記事
[【AWS VPC入門】0.概要](https://qiita.com/_Yasuun_/items/ae6b1b7fa3397256ee90)
[【AWS VPC入門】1.VPC/Subnet](https://qiita.com/_Yasuun_/items/8677681a21ae7437757f)
[【AWS VPC入門】2.EC2/Internet Gateway/Route Table](https://qiita.com/_Yasuun_/items/fc6f401eeaf9a3cb7b2c)
[【AWS VPC入門】3.ELB](https://qiita.com/_Yasuun_/items/454f78a64aadc5d10098)

# 今回のゴール
- `SampleWeb`へのSSH接続をするための`SampleBastion`をPublicサブネットに設置する。
- Privateサブネット内のインスタンスがインターネットと通信するためのNATゲートウェイを配置する。

# Bastion(踏み台)サーバー
PrivateサブネットのようにDMZに配置されていないインスタンスに対してメンテナンス時や調査時の接続を目的としたサーバー。

# NatGateway
Privateサブネットに配置されたIPアドレスを持たないインスタンスからインターネットへアクセスする際にネットワークアドレス変換を行うためのゲートウェイ。

# サブネットのルートテーブル変更
今までは動作確認のためPrivateサブネットにインターネットゲートウェイをアタッチしていましたが、「概要編」で紹介した全体図にするため、それぞれのサブネットのルートテーブルを変更します。

`SamplePublicSubnet`にはルートテーブルが存在しないため、VPCのダッシュボードから 「ルートテーブルの新規作成」を選択肢、`SamplePublicRouteTable`を作成します。

詳細な手順は [【AWS VPC入門】2.EC2/Internet Gateway/Route Table](https://qiita.com/_Yasuun_/items/fc6f401eeaf9a3cb7b2c) で実施した内容と同じです。
<img width="1266" alt="スクリーンショット 2018-12-23 11.52.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/dee20d35-77cd-d9fc-5a38-fb9778fca132.png">

作成した`SamplePublicRouteTable`のルートを編集し、デフォルトゲートウェイをインターネットゲートウェイに設定します。
<img width="1034" alt="スクリーンショット 2018-12-23 11.53.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/0ec6c5cb-7bfd-7cc6-068d-9ffd7fcde7f1.png">

`SamplePublicRouteTable`を`SamplePublicSubnet`にアタッチします。
<img width="1271" alt="スクリーンショット 2018-12-23 11.54.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/02af1fa2-26cf-1ef0-9341-763e75e91e85.png">

Privateサブネットからはインターネットへ直接アクセスすることを禁止するため、`SamplePrivateRouteTable`のルートからインターネットゲートウェイの設定を削除します。
<img width="1271" alt="スクリーンショット 2018-12-23 12.28.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/c2022bb0-2404-e727-6f3e-a22f608da1d5.png">

# Bastionサーバーの設置
続いてパブリックサブネットにBastionサーバーを配置します。

インスタンスの作成から`SampleWeb`と同じスペックの`SampleBastion`を作成します。
<img width="1277" alt="スクリーンショット 2018-12-23 11.00.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/4e710d77-7a06-5315-a0aa-3374c3948d68.png">

サブネットに`SamplePublicSubnet`を選択し、`PublicIPの自動割当` を有効にしておきます。
<img width="1276" alt="スクリーンショット 2018-12-23 11.21.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/4dd48577-8cdf-08da-0e7d-3688b212686f.png">

セキュリティグループを以下の内容で設定します。
<img width="946" alt="スクリーンショット 2018-12-23 11.04.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/8b1cba12-22d2-5102-6e04-024747699bfa.png">

こちらの`SampleWeb`と同様に、後ほどSSH接続を行うためpemファイルのDLが必要です。(SampleVPCBastion.pem)

# BastionサーバーからWebサーバーへのSSH
前準備としてBastionサーバーに`SampleWeb`用のpemファイルを配置します。

```
$ chmod 600 SampleVPCBastion.pem
$ scp -i SampleVPCBastion.pem ./SampleVPCWeb.pem ec2-user@BastionサーバーのグローバルIP:~/.ssh/
```

続いて`SampleWeb`のセキュリティグループを変更します。
SSHのインバウンドを`任意のIP`からBastionサーバーのセキュリティグループ(`SampleBastionSG`)に変更します。
<img width="1279" alt="スクリーンショット 2018-12-23 12.10.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/2f03cd0b-5965-3c57-861f-ab6d3c1fc37e.png">


以下のコマンドでSSHの接続確認を行います。

```
# ローカル環境からBastionサーバーへの接続
$ cd .ssh/
$ ssh -i "SampleVPCBastion.pem" ec2-user@BastionサーバーのグローバルIP

# BastionサーバーからSampleWebへの接続
$ cd .ssh/
$ ssh -i "SampleVPCWeb.pem" ec2-user@SampleWebサーバーのローカルIP
```

ここまでで `SampleBastion`->`SampleWeb` のSSH接続が可能になりました。
ですが本章の最初で`SamplePrivateSubnet`のルートテーブルからインターネットゲートウェイへのルートを削除したため、`SampleWeb`からインターネットへの接続ができない状態になっています。

```
# SampleWeb内からインターネットへの接続は不可
$ sudo yum update
タイムアウトエラー
```

この状態を解決するためNATゲートウェイを設置します。

# NATゲートウェイの配置

VPCのダッシュボードから`NATゲートウェイ`を選択し、`NATゲートウェイの作成`を行います。

<img width="1277" alt="スクリーンショット 2018-12-23 12.38.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/b8246c38-2f3b-104e-6bb7-dd585148161b.png">

配置先のサブネットは`SamplePublicSubnet`を選択します。
EIPの割当が必須のため、新しいEIPを発行して割り当てます。
<img width="1278" alt="スクリーンショット 2018-12-23 12.52.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/a9076094-92f7-bd76-2943-fa33970e3133.png">

`SamplePrivateSubnet`ルートテーブルを再度編集します。
<img width="1272" alt="スクリーンショット 2018-12-23 12.40.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/e08b6558-f341-cc30-1ca8-fc996633cf6d.png">

デフォルトゲートウェイを先程作成したNATゲートウェイにします。
<img width="1245" alt="スクリーンショット 2018-12-23 12.41.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/417fa0b2-c393-95a7-cc37-f87a8b95d8a0.png">

ここまでで、SampleWeb内からNAT経由のインターネットへの接続が可能になりました。

```
# SampleWeb内からインターネットへの接続が可能になるyum updateが成功するはず。
$ sudo yum update
....
```

# LBの再設定

現在の状態では、`SamplePrivateSubnet`のルートテーブルからインターネットゲートウェイを削除したため、ロードバランサーを経由した`SampleWeb`へのアクセスが行えません。

そのため現在使用しているELBを削除し新たに作成します。
[前回の記事](https://qiita.com/_Yasuun_/items/454f78a64aadc5d10098)と同じ手順ですすめ、「サブネットの選択」を`SamplePublicSubnet`にします。
<img width="1267" alt="スクリーンショット 2018-12-23 13.10.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/cf483ab6-7977-ecff-7907-9723834ddfcd.png">

続いて`SampleWeb`のセキュリティグループを変更します。
HTTPのインバウンドを`ELBのIPアドレス`からELBのセキュリティグループ(`SampleElbSG`)に変更します。

<img width="1131" alt="スクリーンショット 2018-12-23 13.08.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/15734/3a209a7e-fd1b-e50c-c785-45905cf631e2.png">

動作確認のため SampleELB に設定されたDNS名を取得し、ブラウザからアクセスしてみます。

前回と同様に `Welcome to nginx on Amazon Linux!` と書かれたNGINXのWelcomeページが表示されていれば成功です。

# 次章
TODO