一般的なWEBアプリケーションの為のAWS構築
一般的なWEBアプリケーション用のシステムをAWSに構築する手順を記載します。管理・NAT以外は冗長構成とします。
※今回はテスト用の環境でコスト削減の為autoscalig、rdsのマルチはしません。次の記事にて紹介します。
VPC
サブネット
サブネットをそれぞれの役割に応じて作成します。
全て先程作成した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)
NAT・Manage用

フロントエンドAZ-A用

フロントエンドAZ-C用

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

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

セキュリティグループ
それぞれのインスタンス・RDBで使用するセキュリティグループを作成していきます。
下記の点に注意します。
- NAT・Manage用は全てのIPからのSSH,HTTPSに関してインバウンドを許可します。
- フロントエンドは特定のIPからのHTTPSに関してインバウンドを許可します。
- アプリケーションはmanageからのSSH,フロントエンドからの8080に関してインバウンドを許可します。(springbootなので。任意のポートに変更ください。)
- RDBはアプリケーションからの5432(postgresqlの場合)に関してインバウンドを許可します。
NAT・Manage用

作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
SSHについては22以外のポートにEC2のSSHを設定後、修正します。
フロントエンド用

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

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

作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
applicationからの5432の通信を許可します。
インターネットゲートウェイ
インターネットゲートウェイの作成

インターネットゲートウェイのアタッチ
先程作成したインターネットゲートウェイを選択し、VPCにアタッチします。
ルートテーブル
デフォルトで作成されるメインのルートテーブルはネットワーク内のみなのでインターネットに接続する用のルートテーブルを作成します。

ルートの設定に「0.0.0.0/0」と先ほど作ったigwを紐付けた物を追加します。
ルートテーブルとサブネットの紐付け
インターネットに紐付けたいサブネットに先程作成したルートテーブルを紐付けていきます。
(今回の場合はフロントエンドとNATのサブネット)
NAT・Manage用のEC2作成
キーペアの設定をします。SSHのキーになります。今回は既に作成した物を使用します。

セキュリティルールを変更します。NATを使用するセキュリティゾーンからのインバウンドを許可します。ソースにセキュリティゾーンを指定します。
先程作成したNAT用インスタンスとElasticIPを紐付けます。
これで作成したインスタンスにSSHで接続できるはずです。
NAT・Manage用のSSHのポート変更
SSHが22のままだと大量に攻撃が来るので変更しておきましょう。
(鍵形式なのでまず大丈夫ですが、気持ちがわるいので。。)
# Port 22
Port 8022
のように編集し、
sudo service sshd restart
で設定を反映してください。port22で新規セッションを開けなくなっているはずです。
忘れずにセキュリティグループもSSHを22から新しいポートに変更しておきましょう。

フォーワード用のユーザを作成します
セキュリティ的にまずいのでフォーワード専用のユーザを作成します。
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
下記を追加します。
Match Group forwarder
AllowTcpForwarding yes
GatewayPorts yes
AllowAgentForwarding no
ForceCommand echo 'This account can only be used for forward'
アプリケーション用のEC2作成
m4Largeを選択しインスタンスの詳細の設定を押下します。
セキュリティグループに先程作成したアプリケーション用の物を割り当てます。
キーペアの設定をします。SSHのキーになります。今回は既に作成した物を使用します。
もう1台も同じようにAZ-Cに作成します。
作成後、わかりやすいように名前をつけておきます。
NATの使用
NATを使用する為にNATを使用したルートテーブルを作成します。
ルートに「0.0.0.0/0」宛の通信のターゲットを先程作成したNATインスタンスを指定します。
NATを使用したい(今回はapplication)サブネットにルートを適用します。
ELBの構築


ELBを配置するアベイラビリティーゾーンとサブネットを選択します。
HTTPSを使用するのでACMにアップしておいた証明書を使用します。



以上でELBが作成されます。
使用時はDNSにて対象ドメインの対象ホストにELBのFQDNをCNAMEで登録します。
試しにapacheを8080で立ち上げて、テストページが表示されれば成功です。
RDBの構築





以上で終了です。
おまけ
踏み台を経由してapplicationサーバからDBにアクセスする場合、sshのトンネルを使用します。
ssh -t -L 5432:RDSのエンドポイント:5432 forwarder@踏み台のIP -i 秘密鍵のパス -p 8022 -o "ServerAliveInterval 60" -o "ExitOnForwardFailure yes" -o "TCPKeepAlive no" -N -f