【AWS初心者向け】パブリック/プライベートサブネットを持つ基本的なネットワーク構成を構築してみる

#やりたいこと
以下構成図に示されるネットワークを作成する。
![qiita0211_2_route.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/ded6858b-7f3e-045f-b179-d5ef786db9f4.png)

・パブリックサブネットとプライベートサブネットを持つVPCを作成する。
・パブリックサブネットに踏み台サーバー、NAT gatewayを設置する。
・プライベートサブネットのEC2インスタンスには踏み台サーバ経由のみアクセス可能にする。

#作成開始
##流れ
1.VPC作成
2.internet gateway作成
3.サブネット作成
4.EC2インスタンス作成
5.NAT gateway作成
6.ルートテーブル作成

###1.VPC作成
VPCのコンソール画面を開き、左側のナビゲーションペインからVPCを選択する。
※VPCウィザードを使用することでサブネットなども一度に作成可能だが、今回は勉強のため一つずつ手動で作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/332c54bc-5888-2135-25b2-ea6ec18d6b72.png)

右上の「VPCを作成」を選択する。
VPCを作成画面で、作成するVPCの名前と(自動的にNameタグが作成される)、
IPv4 CIDRブロック(IPアドレスの範囲)を入力し、「VPCを作成」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/4e26e04d-03b2-3430-6113-be608eea5373.png)

VPCが作成されたことが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/f41a11c4-cfaa-224f-03d6-6a4868f59791.png)

*現在のシステム構成
![qiita0211_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/c9e56b54-7780-bc92-3211-c209625858e9.png)


###2.internet gateway作成
ここは簡単に。
VPCのコンソール画面左側のナビゲーションペインからインターネットゲートウェイ(以降igwと記す)を選択する。
右上の「インターネットゲートウェイの作成」を選択し、作成するigwの名前を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/00c2f6c3-1d9b-ef6e-90e1-efb62e547d86.png)

作成したigwを選択し、右上のアクションからVPCにアタッチを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/c7678470-104c-c378-5ab4-6152d96170f2.png)

この画面で先ほど作成したVPCを選択することで、VPCがインターネットと接続することが可能になる。
VPC選択後「インターネットゲートウェイのアタッチ」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/638bdb1d-aa02-d8f3-2cf3-5c20a9b45660.png)

*現在のシステム構成
![qiita0211_2_igw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/3cbbb6fe-be51-bf26-d3e3-7e46d78c0ed5.png)


###3.サブネット作成
まずはパブリックサブネットを作成する。

VPCのコンソール画面左側のナビゲーションペインからサブネットを選択する。
右上の「サブネットの作成」を選択し、サブネットを作成するVPC(先ほど作成したVPC)、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/6369f4d8-3a86-1065-287c-5af8140be492.png)

作成するサブネットの名前、アベイラビリティゾーン、IPv4 CIDRブロックを入力する。
※入力するCIDRブロックはVPCのアドレスの範囲内である必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/2145493c-73fb-6eea-9fa8-af780037d062.png)

「サブネットを作成」を選択し、入力した情報に基づいてサブネットが作成されていることを確認する。


同様に、プライベートサブネットを作成する。
IPv4 CIDRブロックはVPCのアドレスの範囲内かつ先ほど作成したサブネットのIPアドレス範囲と重複しないように設定する必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/a705aa03-2c62-bf14-bcad-e09629a2b316.png)

パブリックサブネットに設置するインスタンスには自動的にIPアドレスが割り振られるよう、サブネットに設定を行う。
パブリックサブネットを選択し、右上のアクションから自動割り当てIP設定の変更を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/dd97ca58-e1fb-008f-87d5-70ef7dd38327.png)

「パブリック IPv4 アドレスの自動割り当てを有効にする」にチェックを入れ保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/9d3d6407-d3d7-63dd-735d-fba6ee462541.png)

*現在のシステム構成
![qiita0211_2_subnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/024143ca-7c89-1f6c-b07a-b59229743286.png)


###4.EC2インスタンス作成
まずはパブリックサブネットに踏み台サーバーを作成する。

EC2のコンソール画面左側のナビゲーションペインからインスタンスを選択する。
右上の「インスタンスを起動」を選択する。

AMIを選択する。今回はAmazon Linux2を使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/85f9cd99-d2ed-1df3-20d2-c5ac6df1a22e.png)

インスタンスタイプの選択。無料枠の対象のt2.microを使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/3daf2b81-11aa-fcb2-1a67-db3a871292f0.png)

ネットワークに作成してVPC、サブネットを作成したパブリックサブネットに指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/99f03880-6c00-154c-6f2d-0738ef9c5d45.png)

ストレージの追加画面はデフォルト設定のままで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/bb704a48-55af-8d08-f29f-f2c6aca70190.png)

Nameタグを使用してEC2インスタンスに名前を付ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/66c5a8ed-2a91-b494-59d3-43a85c6f0862.png)

セキュリティグループの作成では、新規のセキュリティグループを作成していく。
ソースでIPアドレスを制限することでセキュリティを高めることができるが、今回は全開放で作成する。
丁寧に警告を出してくれているが無視します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/19a19fe6-8f99-1cbc-c3b7-509fcd9e1256.png)

設定値を確認して起動する。
既存のキーペアを選択するか、新しいキーペアを作成するか聞かれますが、今回は踏み台サーバへはEC2 Instance Connectで接続する予定なのでキーペアなしで続行を選択。
下のチェックボックスにもチェックを入れて、インスタンスを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/ece87269-9e18-7492-669a-2ae824cca518.png)

しばらくすると、EC2が立ち上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/369a6b70-644c-ed7b-02e6-97020cc533af.png)


続いてプライベートサブネットにもEC2インスタンスを作成する。
手順は踏み台サーバーと同様。

AMIはAmazon Linux2を使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/85f9cd99-d2ed-1df3-20d2-c5ac6df1a22e.png)

インスタンスタイプはt2.microを使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/3daf2b81-11aa-fcb2-1a67-db3a871292f0.png)

ネットワークは作成したVPC、サブネットはプライベートサブネットを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/bccbe9af-dbce-39ab-9cb2-47092c4a6c84.png)

また今回、簡単のためプライベートのインスタンスへは鍵ではなくパスワードでの接続をするため、
画面下部にスクロールして高度の詳細設定でユーザーデータに下記を入力する。

```
#!/bin/bash
echo 'PrivateInstance' | passwd ec2-user --stdin
sed -i 's|[#]*PasswordAuthentication no|PasswordAuthentication yes|g' /etc/ssh/sshd_config
systemctl restart sshd.service
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/4309a703-6eb9-f337-118c-e7f1ac2e10b1.png)

ストレージの追加画面はデフォルト設定のままで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/bb704a48-55af-8d08-f29f-f2c6aca70190.png)

Nameタグを使用してEC2インスタンスに名前を付ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/c160f233-ea22-7590-29e3-4315155a9807.png)

新規のセキュリティグループを作成する。
今回、プライベートサブネットのインスタンスへは踏み台サーバ経由でしかアクセスしない（できない）ようにする想定なので、ソースに踏み台サーバにアタッチしているセキュリティグループを指定する(セキュリティグループの名前を打つと予測変換してくれる)。
そうすることでそのセキュリティグループがアタッチされているインスタンスからのみしか接続できないように制限が可能になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/69878af8-16f1-edd4-1197-b21e94f0a617.png)

設定値を確認して起動する。
既存のキーペアを選択するか、新しいキーペアを作成するか聞かれますが、パスワードでログインする想定なので、
キーペアなしで続行を選択しインスタンスを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/b38d8124-21c1-9f35-bf2b-c176cab99a96.png)

しばらくすると、EC2が立ち上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/e89c5b84-5760-c88f-79bf-0dda4edeaf7b.png)

*現在のシステム構成
![qiita0211_2_EC2 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/779fa9cd-4aa4-f824-101f-fa54574302de.png)


###5.NAT gateway作成
VPCのコンソール画面左側のナビゲーションペインからNATゲートウェイを選択する。
右上の「NATゲートウェイを作成」を選択し、作成するNATゲートウェイの名前を入力する。
サブネットは作成したパブリックサブネットを指定し、Elastic IPの割り当てを選択し、
Elastic IPを割り当てる。
以上を確認してNATゲートウェイを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/ba522b80-d2b4-2245-526c-fcd51afcceb7.png)

*現在のシステム構成
![qiita0211_2_NAT (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/a42a8c8f-0a11-c105-f560-c02984eeeb78.png)


###6.ルートテーブル作成
ルートテーブルはサブネットごとに割り当てる必要がある。
まずはパブリックサブネット用のルートテーブルを作成する。

VPCのコンソール画面左側のナビゲーションペインからルートテーブルを選択する。
VPC作成時に自動的に一つルートテーブルが作成されているので、それを編集して利用する。
VPC IDを見ると、今回作成されたルートテーブルがどれか分かるので、それを選択し、
ルートタブからルートの編集を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/414c1c9a-566d-5f36-4b46-a9322895806d.png)

インターネットと接続するルートを追加する。
送信先「0.0.0.0/0」、ターゲットに作成したigwを指定する。
ターゲットはプルダウンからInternet Gatewayを選択すると補完してくれる。
以上ができたらルートの保存をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/903aac4b-3977-7e5c-b813-de9a40776e95.png)

パブリックサブネット用ルートテーブルだと分かるように名前を付けておく。
カーソルをName列に持っていくと表示される鉛筆マークを選択すると入力欄が表示されるので、
そこにルートテーブルの名前を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/b1b88557-6976-bd21-26fd-944caae8491c.png)

以上でパブリックサブネット用のルートテーブルが作成できたので、次はプライベートサブネット用のルートテーブルを作成する。
VPCのコンソール画面左側のナビゲーションペインからルートテーブルを選択する。
画面上部のルートテーブルの作成を選択しルートテーブルの名前を入力する。
VPCは作成したVPCを選択する。
以上ができたら作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/e0f89459-ee50-ae35-1ac9-9b195009e50f.png)

作成されたルートテーブルはルートがデフォルトのままなので、ルートタブから編集を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/8fdd517e-0aff-9c70-f399-37bdff337444.png)

こちらは送信先に「0.0.0.0/0」、ターゲットに作成したNAT gatewayを指定して保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/ab96dc0f-9ced-7236-fc8c-039802c94f44.png)

以上でパブリックサブネット、プライベートサブネットそれぞれのルートテーブルが作成できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/c2fbd14b-38f3-ed3c-e990-6883a085abea.png)

これをサブネットに紐づけていく。
まずパブリックサブネット用のルートテーブルを選択し、アクションからサブネットの関連付けの編集を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/cdabfe1b-b9e3-9cd9-af82-56d2faa8b2d8.png)

サブネットの関連付けの編集画面でパブリックサブネットを選択し、保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/05fdc95a-99ae-8e2c-ad47-913936734c20.png)

同様にプライベートサブネット用のルートテーブルもプライベートサブネットに紐づける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/be436b67-db4d-4da8-d564-02f273ccf6cc.png)

*現在のシステム構成
![qiita0211_2_route.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/ded6858b-7f3e-045f-b179-d5ef786db9f4.png)


以上で設定が完了。

#いざ接続
EC2のコンソール画面左側のナビゲーションペインからインスタンスを選択する。
踏み台サーバを選択し、画面上部の「接続」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/ed044302-3467-9296-bf17-a2a2b68886e9.png)

EC2 Instance Connectタブから、ユーザー名はデフォルトの「ec2-user」のままで接続を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/eab62b24-a57b-710f-b17b-6b24eb959a62.png)

CLI画面に遷移する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/6054dee2-688c-472d-1064-53b574b087ca.png)

そうしたら一度、EC2のコンソール画面に戻り接続したいプライベートサブネットのインスタンスのプライベートIPアドレスをコピーしてくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/05c771b4-b73f-eaf6-78f1-939cf57418de.png)

CLI画面に戻り、以下のコマンドを打ち、プライベートサブネットのインスタンスに接続する。
```
ssh <プライベートサブネットのプライベートIP>
```
パスワードを求められるので、「PrivateInstance」と入力する。（プライベートサブネットのインスタンス作成時に入力したユーザーデータで指定している）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/2a492293-bde3-8a46-f65a-0074135eae7c.png)

ログインできた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/25a00f66-fc22-b992-0b50-95abb4a52d7c.png)

curlコマンドで情報を取得できていることからNAT gatewayもしっかり接続できていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684883/6395e296-dc07-99b4-44e0-68784cfd4c53.png)

#おわりに
今回、プライベートサブネットに設置したインスタンスはパスワードでログインする形式にしたが、一般的にはパスワード方式はセキュリティの観点から推奨されていないようです。
そのため、SSMのSession Managerなどセキュアな接続できる方法を調べてメリデメなど比較できたらと思います。