#一般的なWEBアプリケーションの為のAWS構築
一般的なWEBアプリケーション用のシステムをAWSに構築する手順を記載します。管理・NAT以外は冗長構成とします。
※今回はテスト用の環境でコスト削減の為autoscalig、rdsのマルチはしません。次の記事にて紹介します。
##サブネット
サブネットをそれぞれの役割に応じて作成します。
全て先程作成した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)
##セキュリティグループ
それぞれのインスタンス・RDBで使用するセキュリティグループを作成していきます。
下記の点に注意します。
- NAT・Manage用は全てのIPからのSSH,HTTPSに関してインバウンドを許可します。
- フロントエンドは特定のIPからのHTTPSに関してインバウンドを許可します。
- アプリケーションはmanageからのSSH,フロントエンドからの8080に関してインバウンドを許可します。(springbootなので。任意のポートに変更ください。)
- RDBはアプリケーションからの5432(postgresqlの場合)に関してインバウンドを許可します。
作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
SSHについては22以外のポートにEC2のSSHを設定後、修正します。
作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
※現在はソースに0.0.0.0/0(全てという意味)を入力していますが任意のIPに後で変更します。
作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
frontendからの8080からの通信とmanageからのssh接続を許可します。
ソースに関してはセキュリティグループを指定することが出来ますので先程作成しfrontend・nat用のセキュリティグループを指定します。
作成後の一覧より作成したセキュリティグループを選択し、インバウンドタブでルールを編集します。
applicationからの5432の通信を許可します。
##インターネットゲートウェイ
###インターネットゲートウェイの作成
インターネットに接続するためのゲートウェイを作成します。
###インターネットゲートウェイのアタッチ
先程作成したインターネットゲートウェイを選択し、VPCにアタッチします。
##ルートテーブル
デフォルトで作成されるメインのルートテーブルはネットワーク内のみなのでインターネットに接続する用のルートテーブルを作成します。
ルートの設定に「0.0.0.0/0」と先ほど作ったigwを紐付けた物を追加します。
##ルートテーブルとサブネットの紐付け
インターネットに紐付けたいサブネットに先程作成したルートテーブルを紐付けていきます。
(今回の場合はフロントエンドとNATのサブネット)
##NAT・Manage用のEC2作成
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'
m4Largeを選択しインスタンスの詳細の設定を押下します。
セキュリティグループに先程作成したアプリケーション用の物を割り当てます。
キーペアの設定をします。SSHのキーになります。今回は既に作成した物を使用します。
もう1台も同じようにAZ-Cに作成します。
作成後、わかりやすいように名前をつけておきます。
##NATの使用
NATを使用する為にNATを使用したルートテーブルを作成します。
ルートに「0.0.0.0/0」宛の通信のターゲットを先程作成したNATインスタンスを指定します。
NATを使用したい(今回はapplication)サブネットにルートを適用します。
ELBを配置するアベイラビリティーゾーンとサブネットを選択します。
HTTPSを使用するのでACMにアップしておいた証明書を使用します。
以上でELBが作成されます。
使用時はDNSにて対象ドメインの対象ホストにELBのFQDNをCNAMEで登録します。
試しにapacheを8080で立ち上げて、テストページが表示されれば成功です。
以上で終了です。
#おまけ
踏み台を経由して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