Linux
AWS

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

一般的なWEBアプリケーションの為のAWS構築

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

イメージはこんな感じです。
スクリーンショット 2018-01-06 22.57.51.png

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

VPC

まず、全ての元となるVPCを作成します。
スクリーンショット 2018-01-06 16.21.53.png

VPCのネットワークを設定します。
スクリーンショット 2018-01-06 11.52.22.png

作成できると一覧に表示されるので確認してください。
スクリーンショット 2018-01-06 16.25.23.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)

サブネットは下記ボタンより作成していきます。
スクリーンショット 2018-01-06 16.33.02.png

NAT・Manage用

スクリーンショット 2018-01-06 16.37.34.png

フロントエンドAZ-A用

スクリーンショット 2018-01-06 17.11.15.png

フロントエンドAZ-C用

スクリーンショット 2018-01-06 17.15.32.png

アプリケーションAZ-A用

スクリーンショット 2018-01-06 17.16.26.png

アプリケーションAZ-C用

スクリーンショット 2018-01-06 17.17.18.png

セキュリティグループ

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

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

セキュリティグループは下記ボタンを押下し作成していきます。
スクリーンショット 2018-01-06 17.20.34.png

NAT・Manage用

スクリーンショット 2018-01-06 17.23.07.png

作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
SSHについては22以外のポートにEC2のSSHを設定後、修正します。
スクリーンショット 2018-01-06 17.24.54.png

フロントエンド用

スクリーンショット 2018-01-06 17.27.02.png

作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
スクリーンショット 2018-01-06 17.30.06.png
※現在はソースに0.0.0.0/0(全てという意味)を入力していますが任意のIPに後で変更します。

アプリケーション用

スクリーンショット 2018-01-06 17.31.11.png

作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
frontendからの8080からの通信とmanageからのssh接続を許可します。
ソースに関してはセキュリティグループを指定することが出来ますので先程作成しfrontend・nat用のセキュリティグループを指定します。
スクリーンショット 2018-01-06 17.32.26.png

RDB用

スクリーンショット 2018-01-06 17.39.50.png

作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
applicationからの5432の通信を許可します。
スクリーンショット 2018-01-06 17.41.19.png

インターネットゲートウェイ

インターネットゲートウェイの作成

インターネットに接続するためのゲートウェイを作成します。
スクリーンショット 2018-01-04 22.50.07.png

スクリーンショット 2018-01-06 17.42.30.png

インターネットゲートウェイのアタッチ

先程作成したインターネットゲートウェイを選択し、VPCにアタッチします。
スクリーンショット 2018-01-06 17.43.36.png
スクリーンショット 2018-01-06 18.00.15.png

ルートテーブル

デフォルトで作成されるメインのルートテーブルはネットワーク内のみなのでインターネットに接続する用のルートテーブルを作成します。
スクリーンショット 2018-01-06 18.02.16.png

スクリーンショット 2018-01-06 18.06.12.png

ルートの設定に「0.0.0.0/0」と先ほど作ったigwを紐付けた物を追加します。
スクリーンショット 2018-01-06 18.07.58.png

ルートテーブルとサブネットの紐付け

インターネットに紐付けたいサブネットに先程作成したルートテーブルを紐付けていきます。
(今回の場合はフロントエンドとNATのサブネット)
スクリーンショット 2018-01-06 18.11.14.png

紐付けたいサブネットを選択します。
スクリーンショット 2018-01-06 18.13.03.png

NAT・Manage用のEC2作成

EC2の作成をします。
スクリーンショット 2018-01-05 12.26.07.png

NAT用のAMIを選択します。
スクリーンショット 2018-01-06 8.11.27.png

t2.microを選択します。
スクリーンショット 2018-01-05 12.37.27.png

NAT用のサブネットに紐付けます。
スクリーンショット 2018-01-06 18.18.33.png

容量を20Gにします。
スクリーンショット 2018-01-06 18.19.59.png

NAT用のセキュリティグループを選びます。
スクリーンショット 2018-01-06 18.21.13.png

キーペアの設定をします。SSHのキーになります。今回は既に作成した物を使用します。
スクリーンショット 2018-01-05 13.11.58.png

NAT用にソース宛先チェックを無効にします。
スクリーンショット 2018-01-06 20.53.33.png

スクリーンショット 2018-01-06 20.53.41.png

セキュリティルールを変更します。NATを使用するセキュリティゾーンからのインバウンドを許可します。ソースにセキュリティゾーンを指定します。
スクリーンショット 2018-01-06 21.07.53.png

ElasticIPを作成したインスタンスに紐付けます。
スクリーンショット 2018-01-05 15.27.14.png

割り当てを押下してIPアドレスを発行します。
スクリーンショット 2018-01-05 15.28.13.png

アドレスの関連付けよりインスタンスと紐付けます。
スクリーンショット 2018-01-06 22.48.42.png

先程作成したNAT用インスタンスとElasticIPを紐付けます。
スクリーンショット 2018-01-06 18.29.38.png

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

NAT・Manage用のSSHのポート変更

SSHが22のままだと大量に攻撃が来るので変更しておきましょう。
(鍵形式なのでまず大丈夫ですが、気持ちがわるいので。。)

/etc/ssh/sshd_config
#Port 22
Port 8022

のように編集し、

sudo service sshd restart

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

スクリーンショット 2018-01-05 16.22.18.png

フォーワード用のユーザを作成します

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

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

下記を追加します。

/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の作成をします。
スクリーンショット 2018-01-05 8.43.16.png

Amazon Linux2を選択します。
スクリーンショット 2018-01-05 8.46.39.png

m4Largeを選択しインスタンスの詳細の設定を押下します。
スクリーンショット 2018-01-05 8.48.54.png

VPCとサブネット、その他調整したい物を設定します。
スクリーンショット 2018-01-06 21.13.03.png

ディスク容量を今回は20Gで設定します。
スクリーンショット 2018-01-06 21.14.30.png

セキュリティグループに先程作成したアプリケーション用の物を割り当てます。
スクリーンショット 2018-01-06 21.15.04.png

キーペアの設定をします。SSHのキーになります。今回は既に作成した物を使用します。
スクリーンショット 2018-01-05 9.06.37.png

もう1台も同じようにAZ-Cに作成します。
作成後、わかりやすいように名前をつけておきます。
スクリーンショット 2018-01-06 21.19.53.png

NATの使用

NATを使用する為にNATを使用したルートテーブルを作成します。
スクリーンショット 2018-01-06 21.22.39.png

ルートに「0.0.0.0/0」宛の通信のターゲットを先程作成したNATインスタンスを指定します。
スクリーンショット 2018-01-06 21.23.46.png

サブネットに作成したルートテーブルを紐付けます。
スクリーンショット 2018-01-06 21.24.29.png

NATを使用したい(今回はapplication)サブネットにルートを適用します。
スクリーンショット 2018-01-06 21.28.04.png

ELBの構築

ロードバランサーを構築します。
スクリーンショット 2018-01-06 21.35.40.png

スクリーンショット 2018-01-06 21.36.47.png

スクリーンショット 2018-01-06 21.38.12.png

ELBを配置するアベイラビリティーゾーンとサブネットを選択します。
スクリーンショット 2018-01-06 21.41.23.png

HTTPSを使用するのでACMにアップしておいた証明書を使用します。
スクリーンショット 2018-01-06 21.46.59.png

スクリーンショット 2018-01-06 21.51.18.png

スクリーンショット 2018-01-06 21.54.03.png

スクリーンショット 2018-01-06 21.54.46.png

以上でELBが作成されます。
使用時はDNSにて対象ドメインの対象ホストにELBのFQDNをCNAMEで登録します。
試しにapacheを8080で立ち上げて、テストページが表示されれば成功です。
スクリーンショット 2018-01-06 22.26.22.png

RDBの構築

RDBを構築します。
スクリーンショット 2018-01-06 22.28.01.png

スクリーンショット 2018-01-06 22.30.02.png

スクリーンショット 2018-01-06 22.30.50.png

スクリーンショット 2018-01-06 22.31.58.png

スクリーンショット 2018-01-06 22.34.34.png

スクリーンショット 2018-01-06 22.36.20.png

以上で終了です。

おまけ

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

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