🌥️

AWS CDK で本番運用を意識した Wordpress(ECS)環境を作成する

2022/08/07に公開

課題

同じような構成の Wordpress 環境を AWS 上に作成する機会が多く、今までは Rain + CFn でパラメータを駆使しデプロイ先環境名やプロジェクト名を引き回していましたが、環境毎に同じようなテンプレートファイルを複数管理する状態になってしまいました(これは管理の問題なので反省しています)。

解決策

AWS CDK を利用する事でパラメータとして CFn に記載している各 AWS サービスの設定情報を、別ファイルに定義する事で定義ファイルのみ変更すればコードは使いまわせそうだなと考えました、今回は Typescript で実装しようと思います。

自分要件

  1. cdk 実行時にパラメータでデプロイ先(stg, prod, etc...)を分けたい
  2. デプロイ先によって AWS サービスの設定情報を分けたい
  3. スタックを分けたい

実装

パラメータでデプロイ先を分ける

-c パラメータで context を追加できるのでそちらを利用し、cdk.json にパラメータで指定するデプロイ先の階層を設定する事で、AWS 設定情報を変更する事ができました。

cdk deploy -c stage=prod

設定情報を分けたい

cdk.json 内にデプロイ先毎の AWS サービス設定情報を記載し Construct.node.tryGetContext メソッドでデータを取得するようにしました、以下は VPC で利用する設定情報です(prod 用の設定情報のみ記載)。
https://github.com/gajirou/aws-cdk-wordpress/blob/main/src/cdk.json#L39-L45
こちらを取得するクラスを作成し、、、
https://github.com/gajirou/aws-cdk-wordpress/blob/main/src/lib/context-getter.ts#L26-L33
各スタック内で利用するようにしました。
https://github.com/gajirou/aws-cdk-wordpress/blob/main/src/lib/vpc-stack.ts#L19-L27

スタックを分けたい

クラスを分ければ良いので、以下の様なスタック(クラス)に分けました。
EC2 + EFS
ALB + TargetGroup
RDS + SubnetGroup + ParameterGroup
ECS(Cluster + Service + Task)
VPC
SecurityGroup

使い回し方

以下を利用している AWS アカウントに合わせて修正
https://github.com/gajirou/aws-cdk-wordpress/blob/main/.env
コンテナを起動し接続する。

docker compose up -d
docker compose exec aws-cdk ash

コンテナに接続後に node module を installし、cdk.json のパラメータを諸々変更します。

デプロイは、以下コマンドで実施します。

cdk deploy --all --require-approval never -c stage=prod

完成したソースコードは以下に上げています。
https://github.com/gajirou/aws-cdk-wordpress

まとめ

作成される AWS リソース

EC2 + EFS

デザイナーさん等の外部の方が作業する事を想定し作業用の EC2 を建てています(キーペアは先に作成済)。
Wordpress のソースを格納するディレクトリとなる EFS を ECS でもマウントしているので、ソースの修正やファイルのアップロードは ECS にも反映されます、EC2 側のマウント処理は User data で起動時に実行されています。

ALB + TargetGroup

HTTP => HTTPS のリダイレクト設定をするようにルールを指定します、ACM の ARN を cdk.json で設定していますが、こちらは先んじて AWS マネージメントコンソールから作成しています。
ALB のログを S3 のバケットに出力する設定をしていますが、バケット名が一意にならない場合はバケット名を取得するメソッドで、一意になるように修正ください。

RDS + SubnetGroup + ParameterGroup

パラメータグループでは文字コードの変更を実施しています、パブリック側への配置やマルチ AZ への変更はこちらのクラスを変更ください、DB パスワードは AWS Secret Manager を確認ください。

ECS(Cluster + Service + Task)

DockerHub の Wordpress 公式コンテナを利用するにしていますが、独自イメージを ECR から Pull する場合は、該当クラスのコメントアウトを削除して利用ください。
https://github.com/gajirou/aws-cdk-wordpress/blob/main/src/lib/ecs-stack.ts#L67-L78
Fargate タイプとなり execute コマンドは有効にしているので、以下で簡単にコンテナに接続できます(宣伝です)。
https://zenn.dev/gaji/articles/a98b74c5ddd5a8

VPC

外向けの IP を固定したかったので Private Subnet に NAT Gateway を付与する形にしていますが、不要ならこちらのクラスを変更ください。

SecurityGroup

各サービスで通信可能な最低限の設定と、cdk.json で設定した Myip からのアクセスを可能とします、ただ ALB のスタックは気をきかせて 0.0.0.0/0 から HTTP, HTTPS へのアクセスをデフォルトで可能にしてくれるので、不要なら削除ください。

まとめ

という感じで、AWS CDK で Wordpress 環境を作成する事ができました、DNS レコードの登録については、ドメイン管理が AWS でない場合も考慮して手動で行う想定です。

cdk.json の階層が深くなった事で、スナップショットテスト時に簡単に context を読み込めない事態が発生したので、一旦 cdk.test.json を作成し context 配下をテスト用に記載する事にしましたが、今後改善したいと思います。

その後

ロググループの設定を忘れていたので追加しました。
https://github.com/gajirou/aws-cdk-wordpress/blob/main/src/lib/ecs-stack.ts#L82-L98

Discussion