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


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

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

イメージはこんな感じです。

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

VPC

まず、全ての元となるVPCを作成します。

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作成

EC2の作成をします。

NAT用のAMIを選択します。

t2.microを選択します。

NAT用のサブネットに紐付けます。

容量を20Gにします。

NAT用のセキュリティグループを選びます。

キーペアの設定をします。SSHのキーになります。今回は既に作成した物を使用します。

NAT用にソース宛先チェックを無効にします。

セキュリティルールを変更します。NATを使用するセキュリティゾーンからのインバウンドを許可します。ソースにセキュリティゾーンを指定します。

ElasticIPを作成したインスタンスに紐付けます。

割り当てを押下してIPアドレスを発行します。

アドレスの関連付けよりインスタンスと紐付けます。

先程作成したNAT用インスタンスとElasticIPを紐付けます。

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

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

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

/etc/ssh/sshd_config
#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

下記を追加します。

/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の作成をします。

Amazon Linux2を選択します。

m4Largeを選択しインスタンスの詳細の設定を押下します。

VPCとサブネット、その他調整したい物を設定します。

ディスク容量を今回は20Gで設定します。

セキュリティグループに先程作成したアプリケーション用の物を割り当てます。

キーペアの設定をします。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の構築

RDBを構築します。

以上で終了です。

おまけ

踏み台を経由して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