はじめに
Web3層アーキテクチャを構築したときにハマってガチャガチャやったり調べたりしたポイントをメモりました。本記事ではインフラ構築部分を対象にします。(Webサーバ自体の設定だったり監視周りは割愛します)
ベーシックなALB+EC2+RDS(MySQL+Memcached)構成です。
ネットワークまわり
VPC作成
2AZでそれぞれパブリックサブネットとプライベートサブネットを1つずつ作成する、といったベーシックな構成であれば「VPCなど」を選択してサブネット、ルートテーブル、NAT Gatewayも含めて一気に作ることができます。
VPC作ってサブネット作って…とそれぞれやると何だかんだいって時間かかるのでできるだけVPC作成時にまとめて設定してしまう方が楽ですね。
基本デフォルトの設定で大丈夫ですが、NAT Gatewayはデフォルトだと「なし」、VPCエンドポイントはS3ゲートウェイを作成になっているので、要件によって変更しましょう。
たまにやってしまいますが、VPCを切り替えるのを忘れてデフォルトVPCにセキュリティグループを作っちゃったりします。使わないのであればデフォルトVPCは削除してしまったほうが、GUIでの設定ミスを減らせるかなと思います。
デフォルトVPCについて
サブネット作成
VPC作成時に同時作成します。各AZにパブリックサブネット、プライベートサブネットを1つずつ作成します。
NAT GatewayまたはVPCエンドポイントの作成
VPC作成時に同時作成します。VPCエンドポイントで接続できるリソースへの通信であれば、VPCエンドポイントを通したほうが通信料を抑えられます。
ルートテーブルの作成
VPC作成時に同時作成します。
セキュリティグループ作成
ALB, EC2, RDS用にセキュリティグループを作ります。ALBはAnywhere IPv4からの通信を許可しますが、EC2はALBのセキュリティグループから、RDSはEC2のセキュリティグループからの通信のみ許可します。
サーバセットアップ
EC2用のロール作成
SystemsManagerでEC2に接続できるように、AmazonSSMManagedInstanceCore
ポリシーを含んだロールを作成します。
EC2にAmazonSSMManagedInstanceCoreポリシーをつけるのはよくあるユースケースらしく、ユースケースのラジオボタンでEC2 Role for AWS Systems Manager
を選べば設定できるようになっています。
AutoScaling Groupの作成
起動したインスタンスからイメージの作成を選択し、AMIを作成します。
作成したAMIを指定して起動テンプレートを作ります。
作成した起動テンプレートを指定してAutoScaling Groupを作成します。耐障害性を高めるためにマルチAZでグループを作るのが無難かなと思います。
ALBのターゲットグループの設定
EC2を選択したら「保留中として以下を含める」をクリックして、ターゲットリストに入れないとターゲットグループに登録されないので注意。登録されてないままALBにブラウザアクセスしても503が返ってきます。
ヘルスチェックのデフォルトの設定は200が返ってきたらOKという扱いになりますが、ヘルスチェックのパスを間違えてたり(デフォルトの"/"のままにしてたり)するとリダイレクトされて3xxが返ってきてNG…になったりします。(なった)
ALBの作成
ターゲットグループを指定してALBを作成します。作成時にWAFも同時に作成するか選択できます。
DB設定
Memcached作成
Memcachedにアタッチするセキュリティグループは、カスタムTCPプロトコルの11211番ポートを開けておく必要があります。
Memcachedで転送中の暗号化がオンになっている場合、WordPressのW3 Total Cacheプラグインからは接続できないようです。
ここでしばらく引っ掛かっていて以下記事の内容がドンピシャでした。
Memcached+WordPressのW3 Total Cacheプラグインの構成にしたい場合、Memcachedの作成時に転送中の暗号化をオフにしておく必要があります。(後から変えられない…
作成するときですが、サーバレスを指定すると転送中の暗号化をオフにできなさそう(セキュリティ設定をカスタマイズにしてもいじれない…)なので、
「独自のキャッシュを設計」->「標準作成」で転送中の暗号化をオフにしておきます
おわりに
初回構築時はヘルスチェック通らないぞ、閾値おかしいのかな -> 作成するリソースのVPC間違えやALBの設定ミスが原因、でめちゃくちゃ時間を食いました。
GUIで全てをポチポチ作ることはあまり無いかもしれないですが、VPC作成時になるべくまとめてリソースを作ったり、使わないデフォルトVPCは消しておくなどの工夫でミスを減らせるなあと実感しました。