一般的なWEBアプリケーションの為のAWS構築（テスト編）

#一般的なWEBアプリケーションの為のAWS構築
一般的なWEBアプリケーション用のシステムをAWSに構築する手順を記載します。管理・NAT以外は冗長構成とします。

イメージはこんな感じです。
<img width="452" alt="スクリーンショット 2018-01-06 22.57.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/d3a5961a-b425-e813-d0e3-29fee64831fd.png">


※今回はテスト用の環境でコスト削減の為autoscalig、rdsのマルチはしません。次の記事にて紹介します。

##VPC
まず、全ての元となるVPCを作成します。
<img width="475" alt="スクリーンショット 2018-01-06 16.21.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/d0b77af3-2b0a-021e-ea16-291b7fe442ad.png">

VPCのネットワークを設定します。
<img biwidth="681" alt="スクリーンショット 2018-01-06 11.52.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/ac97a8a3-09cf-9fba-f776-147605256dcd.png">

作成できると一覧に表示されるので確認してください。
<img width="646" alt="スクリーンショット 2018-01-06 16.25.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/ad83d573-7945-d3be-38e8-1a2bbf4a053c.png">

##サブネット
サブネットをそれぞれの役割に応じて作成します。
全て先程作成したVPCに紐付けていきます。

 - hoge_nat_aza：NAT・SSH接続をする管理用のサブネット
 - hoge_frontend_aza：WEB接続を受け付けるサブネット（AZ A）
 - hoge_frontend_azc：WEB接続を受け付けるサブネット（AZ C）
 - hoge_application_aza：アプリケーションサーバのサブネット（AZ A）
 - hoge_application_azc：アプリケーションサーバのサブネット（AZ A）

サブネットは下記ボタンより作成していきます。
<img width="570" alt="スクリーンショット 2018-01-06 16.33.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/5584afc4-27fa-2045-0333-4fed2d927627.png">

###NAT・Manage用
<img width="877" alt="スクリーンショット 2018-01-06 16.37.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/5f66b2d4-bc20-9d79-9a18-9d1305f9f8ad.png">

###フロントエンドAZ-A用
<img width="869" alt="スクリーンショット 2018-01-06 17.11.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/0e389551-d294-4ddc-7a46-0c579e729cd6.png">

###フロントエンドAZ-C用
<img width="873" alt="スクリーンショット 2018-01-06 17.15.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/e31d8eea-0ed9-b800-04b5-8786aa8ffa45.png">

###アプリケーションAZ-A用
<img width="865" alt="スクリーンショット 2018-01-06 17.16.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/11243afd-0f01-cb1a-9c21-d1e664dfd183.png">

###アプリケーションAZ-C用
<img width="869" alt="スクリーンショット 2018-01-06 17.17.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/0278f439-158f-dbc6-cf82-e11acca11e72.png">

##セキュリティグループ
それぞれのインスタンス・RDBで使用するセキュリティグループを作成していきます。
下記の点に注意します。

 - NAT・Manage用は全てのIPからのSSH,HTTPSに関してインバウンドを許可します。
 - フロントエンドは特定のIPからのHTTPSに関してインバウンドを許可します。
 - アプリケーションはmanageからのSSH,フロントエンドからの8080に関してインバウンドを許可します。（springbootなので。任意のポートに変更ください。）
 - RDBはアプリケーションからの5432(postgresqlの場合)に関してインバウンドを許可します。

セキュリティグループは下記ボタンを押下し作成していきます。
<img width="871" alt="スクリーンショット 2018-01-06 17.20.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/55a33070-1e90-6c57-ef85-2a0afd21eac1.png">

###NAT・Manage用
<img width="660" alt="スクリーンショット 2018-01-06 17.23.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/df63d30d-0ac3-1a6b-c56b-0f7b5d9a0f97.png">

作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
SSHについては22以外のポートにEC2のSSHを設定後、修正します。
<img width="863" alt="スクリーンショット 2018-01-06 17.24.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/39037aff-b923-3e46-e5fc-0cc7532db6ff.png">

###フロントエンド用
<img width="655" alt="スクリーンショット 2018-01-06 17.27.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/8b19d120-8a41-1d66-0ffd-0cf0bc9d9bea.png">

作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
<img width="861" alt="スクリーンショット 2018-01-06 17.30.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/489ef859-92b4-81e1-0b85-0f773328ab3c.png">
※現在はソースに0.0.0.0/0（全てという意味）を入力していますが任意のIPに後で変更します。

###アプリケーション用
<img width="661" alt="スクリーンショット 2018-01-06 17.31.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/308997d4-6005-7b25-7015-e80cca242092.png">

作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
frontendからの8080からの通信とmanageからのssh接続を許可します。
ソースに関してはセキュリティグループを指定することが出来ますので先程作成しfrontend・nat用のセキュリティグループを指定します。
<img width="855" alt="スクリーンショット 2018-01-06 17.32.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/2ecda0b4-d75b-d70c-1a9c-5fb0641a6917.png">

###RDB用
<img width="659" alt="スクリーンショット 2018-01-06 17.39.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/c3002f65-eeeb-0c2d-f497-8d5cd9eb7c66.png">

作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
applicationからの5432の通信を許可します。
<img width="854" alt="スクリーンショット 2018-01-06 17.41.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/03a98e62-72ad-25bb-b557-192e98823a88.png">

##インターネットゲートウェイ
###インターネットゲートウェイの作成
インターネットに接続するためのゲートウェイを作成します。
<img width="862" alt="スクリーンショット 2018-01-04 22.50.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/fb568396-0fab-b0d7-8333-5a3761c6de1f.png">

<img width="663" alt="スクリーンショット 2018-01-06 17.42.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/f7157dd4-4418-0f9a-233e-074940a1a8f5.png">

###インターネットゲートウェイのアタッチ
先程作成したインターネットゲートウェイを選択し、VPCにアタッチします。
<img width="526" alt="スクリーンショット 2018-01-06 17.43.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/a0512279-a784-e381-e838-378ca34e6e6b.png">
<img width="672" alt="スクリーンショット 2018-01-06 18.00.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/f4c4d11b-26be-2321-547c-5ad8f2f15ba6.png">

##ルートテーブル
デフォルトで作成されるメインのルートテーブルはネットワーク内のみなのでインターネットに接続する用のルートテーブルを作成します。
<img width="546" alt="スクリーンショット 2018-01-06 18.02.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/f35d2319-e638-960a-0109-d094e2dca728.png">

<img width="678" alt="スクリーンショット 2018-01-06 18.06.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/7de7af5a-accd-b400-20d1-8cdb87ee046b.png">

ルートの設定に「0.0.0.0/0」と先ほど作ったigwを紐付けた物を追加します。
<img width="651" alt="スクリーンショット 2018-01-06 18.07.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/dbe83e6b-a134-a52c-b712-05a025dc2c84.png">

##ルートテーブルとサブネットの紐付け
インターネットに紐付けたいサブネットに先程作成したルートテーブルを紐付けていきます。
（今回の場合はフロントエンドとNATのサブネット）
<img width="492" alt="スクリーンショット 2018-01-06 18.11.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/be6264cf-f6df-1da6-21e6-44d247378626.png">

紐付けたいサブネットを選択します。
<img width="668" alt="スクリーンショット 2018-01-06 18.13.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/b92fb650-90c9-9414-50e9-7b5bfa105277.png">

##NAT・Manage用のEC2作成
EC2の作成をします。
<img width="580" alt="スクリーンショット 2018-01-05 12.26.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/ff89bfad-95d9-9766-b726-99c740cb94f9.png">

NAT用のAMIを選択します。
<img width="1083" alt="スクリーンショット 2018-01-06 8.11.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/69744246-6fc6-4d56-d992-29e810463984.png">

t2.microを選択します。
<img width="1207" alt="スクリーンショット 2018-01-05 12.37.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/e53b7974-d057-b65a-696e-80218003fc03.png">

NAT用のサブネットに紐付けます。
<img width="744" alt="スクリーンショット 2018-01-06 18.18.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/07ff3a2e-da70-9613-add7-60121bf5a46c.png">

容量を20Gにします。
<img width="746" alt="スクリーンショット 2018-01-06 18.19.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/c92d53bb-7f04-0d11-c2f7-5191650b6a6e.png">

NAT用のセキュリティグループを選びます。
<img width="769" alt="スクリーンショット 2018-01-06 18.21.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/4c8489b0-192f-ecab-2d3b-8f5060ef549d.png">

キーペアの設定をします。SSHのキーになります。今回は既に作成した物を使用します。
<img width="666" alt="スクリーンショット 2018-01-05 13.11.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/9347231a-d9ad-abb7-c0d7-b9aa956c28a1.png">

NAT用にソース宛先チェックを無効にします。
<img width="755" alt="スクリーンショット 2018-01-06 20.53.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/9a8f34fe-5eec-3951-4eef-a78ede3c5e81.png">

<img width="562" alt="スクリーンショット 2018-01-06 20.53.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/a3dc61d3-0fd7-a402-6781-d4c85651ea7f.png">

セキュリティルールを変更します。NATを使用するセキュリティゾーンからのインバウンドを許可します。ソースにセキュリティゾーンを指定します。
<img width="1082" alt="スクリーンショット 2018-01-06 21.07.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/e67fa5a7-de78-453c-4cc9-7a45f84449cf.png">

ElasticIPを作成したインスタンスに紐付けます。
<img width="764" alt="スクリーンショット 2018-01-05 15.27.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/38f3918e-636d-1ce5-251a-455a5917bbd5.png">

割り当てを押下してIPアドレスを発行します。
<img width="596" alt="スクリーンショット 2018-01-05 15.28.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/3fa2e469-13fb-27a1-6378-db45d1427f92.png">

アドレスの関連付けよりインスタンスと紐付けます。
<img width="475" alt="スクリーンショット 2018-01-06 22.48.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/4b38d107-bf51-ca12-6751-61b5654ffe23.png">


先程作成したNAT用インスタンスとElasticIPを紐付けます。
<img width="835" alt="スクリーンショット 2018-01-06 18.29.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/1e44c7d7-e05b-2586-6cc7-a652c02f84de.png">

これで作成したインスタンスにSSHで接続できるはずです。

##NAT・Manage用のSSHのポート変更
SSHが22のままだと大量に攻撃が来るので変更しておきましょう。
（鍵形式なのでまず大丈夫ですが、気持ちがわるいので。。）

```lang:/etc/ssh/sshd_config
#Port 22
Port 8022
```
のように編集し、

```lang:
sudo service sshd restart
```
で設定を反映してください。port22で新規セッションを開けなくなっているはずです。
忘れずにセキュリティグループもSSHを22から新しいポートに変更しておきましょう。

<img width="451" alt="スクリーンショット 2018-01-05 16.22.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/b5746e0f-e8e8-d491-3a87-0bf979742f09.png">

##フォーワード用のユーザを作成します
セキュリティ的にまずいのでフォーワード専用のユーザを作成します。

```lang:
groupadd -g 20000 forwarder
useradd -m -g forwarder -s /sbin/nologin forwarder
cd /home/forwarder/
mkdir .ssh
chown forwarder:forwarder .ssh/
chmod 700 .ssh/
cd .ssh/
ssh-keygen -t rsa -b 4096 -f id_rsa
chown forwarder:forwarder id_rsa*
chmod 600 id_rsa*
cat id_rsa.pub > authorized_keys
chmod 600 authorized_keys
chown forwarder:forwarder authorized_keys
```

下記を追加します。

```lang:/etc/ssh/sshd_config
Match Group forwarder
        AllowTcpForwarding yes
        GatewayPorts       yes
        AllowAgentForwarding no
        ForceCommand echo 'This account can only be used for forward'
```

##アプリケーション用のEC2作成
EC2の作成をします。
<img width="605" alt="スクリーンショット 2018-01-05 8.43.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/33438772-1b10-a770-f6c3-e3c82bb27755.png">

Amazon Linux2を選択します。
<img width="1199" alt="スクリーンショット 2018-01-05 8.46.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/f02c341e-6efb-20aa-619f-7bc01b30b47f.png">

m4Largeを選択しインスタンスの詳細の設定を押下します。
<img width="1210" alt="スクリーンショット 2018-01-05 8.48.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/9d2ea943-9798-4581-ecfc-635c0704625c.png">

VPCとサブネット、その他調整したい物を設定します。
<img width="952" alt="スクリーンショット 2018-01-06 21.13.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/c9b1e31d-1f8c-b3cf-63a2-bd3316d6de16.png">

ディスク容量を今回は20Gで設定します。
<img width="845" alt="スクリーンショット 2018-01-06 21.14.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/02c24b83-b964-6fc6-58b5-064c945df298.png">

セキュリティグループに先程作成したアプリケーション用の物を割り当てます。
<img width="936" alt="スクリーンショット 2018-01-06 21.15.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/ff013c00-c6d4-eabe-8ad6-69f1476a2130.png">

キーペアの設定をします。SSHのキーになります。今回は既に作成した物を使用します。
<img width="684" alt="スクリーンショット 2018-01-05 9.06.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/0890f33f-cf0c-164b-6fa8-9c99f36b1828.png">

もう１台も同じようにAZ-Cに作成します。
作成後、わかりやすいように名前をつけておきます。
<img width="581" alt="スクリーンショット 2018-01-06 21.19.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/8aa375c7-8c03-732d-0465-3d5fb1afee69.png">

##NATの使用
NATを使用する為にNATを使用したルートテーブルを作成します。
<img width="675" alt="スクリーンショット 2018-01-06 21.22.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/a67e2fcc-55c0-0ade-4475-a6b11906fd47.png">

ルートに「0.0.0.0/0」宛の通信のターゲットを先程作成したNATインスタンスを指定します。
<img width="603" alt="スクリーンショット 2018-01-06 21.23.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/9149be55-2b06-8f5e-5a0b-464180a11f95.png">

サブネットに作成したルートテーブルを紐付けます。
<img width="490" alt="スクリーンショット 2018-01-06 21.24.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/262aa21a-f822-aa06-de77-f7eddd45d157.png">

NATを使用したい（今回はapplication）サブネットにルートを適用します。
<img width="581" alt="スクリーンショット 2018-01-06 21.28.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/8a2d7b1f-3eec-4793-f7b3-ac4537f7494b.png">

##ELBの構築
ロードバランサーを構築します。
<img width="537" alt="スクリーンショット 2018-01-06 21.35.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/33c2b804-a6e4-4493-96b9-626b2b465172.png">

<img width="605" alt="スクリーンショット 2018-01-06 21.36.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/b74a47f3-2ea2-b48e-ece3-a7f1cb4272b3.png">

<img width="658" alt="スクリーンショット 2018-01-06 21.38.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/f55d586e-d72a-9a94-54a3-71847c861e40.png">

ELBを配置するアベイラビリティーゾーンとサブネットを選択します。
<img width="1083" alt="スクリーンショット 2018-01-06 21.41.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/e58747a2-a730-b2f3-9005-4fd5d124033b.png">

HTTPSを使用するのでACMにアップしておいた証明書を使用します。
<img width="777" alt="スクリーンショット 2018-01-06 21.46.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/db90e8c7-e0bd-9794-6f0f-c38b9b7dfe27.png">

<img width="865" alt="スクリーンショット 2018-01-06 21.51.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/e38ebe86-40d2-5836-6bfd-3447ece6168c.png">

<img width="705" alt="スクリーンショット 2018-01-06 21.54.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/1e55a2b6-22e5-3afa-e5e1-2f5521aefa7f.png">

<img width="688" alt="スクリーンショット 2018-01-06 21.54.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/6d60f8a6-e6c2-d37f-9d64-3610267bc433.png">

以上でELBが作成されます。
使用時はDNSにて対象ドメインの対象ホストにELBのFQDNをCNAMEで登録します。
試しにapacheを8080で立ち上げて、テストページが表示されれば成功です。
<img width="1014" alt="スクリーンショット 2018-01-06 22.26.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/bf818d59-9827-628b-376e-ea8ed171c173.png">

##RDBの構築
RDBを構築します。
<img width="574" alt="スクリーンショット 2018-01-06 22.28.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/db6d3828-56f9-995d-e7e0-ae7093d5e3e7.png">

<img width="691" alt="スクリーンショット 2018-01-06 22.30.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/ee004502-453e-9a8d-f545-d623d814df70.png">

<img width="693" alt="スクリーンショット 2018-01-06 22.30.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/378d2975-70d8-b02f-a9cb-bf327f755d42.png">

<img width="536" alt="スクリーンショット 2018-01-06 22.31.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/5b48b425-5057-aa45-16d0-d9f3a295872b.png">

<img width="736" alt="スクリーンショット 2018-01-06 22.34.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/923b9fef-6930-ec20-2d9f-97a7df59c2d6.png">

<img width="545" alt="スクリーンショット 2018-01-06 22.36.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/56889/13eb39ec-361b-b361-3eb9-0a1001f7d72a.png">

以上で終了です。

#おまけ
踏み台を経由してapplicationサーバからDBにアクセスする場合、sshのトンネルを使用します。

```lang:Macの場合
ssh -t -L 5432:RDSのエンドポイント:5432 forwarder@踏み台のIP -i 秘密鍵のパス -p 8022 -o "ServerAliveInterval 60" -o "ExitOnForwardFailure yes" -o "TCPKeepAlive no" -N -f
```