可能な限りAWSをフル活用したインフラを組んでみたもの。題材としてWordpressを利用。
できる限り実運用を想定しています。
細かい検討メモなどはQiitaの記事参照。
注意: この構成による実運用実績は無いため、思わぬ欠陥がある可能性は否定できません
一般ユーザのリクエストはCloudfrontで、管理画面アクセスはALB直(別ドメイン割当)で行う。
負荷対策はCloudfrontでやる構成(ユーザごとやリクエストごとに動的なコンテンツは無い想定)。
AWS WAFをALBに紐付け、いわゆるWAFの役割&管理画面やIPでのアクセス制限を行う。
コンピューティングはEC2。インスタンス管理の都合でAutoscalingGroupにしているが、自動スケールアウトは負荷増減は未設定(設定しても問題はない)。
メトリクスやログはCloudwatch agentで送信。
※Fargateにしたかったのだが、Fargate + EFSがCDK(Cloudformation)未対応のため見送り
DBはスタンダードにRDS。
ディスクストレージはEFSで、ドキュメントルート以下をまるっと格納。
- 適当なssh可能なAmazonLinux2インスタンスを用意する
playbook
ディレクトリより、上記インスタンスにplaybookを投入する- 完了したらAMIを取得する。AMI名は
wordpress
としておく(cdk.ts
のamiName
に準拠) - 取得完了したらインスタンスは削除しておく
- ACMで証明書を作成する
- ALB(管理画面), ALB(閲覧), Cloudfront(閲覧)にそれぞれセットできればok
- Cloudfront用はバージニアリージョンで発行
- 作成した証明書のARNをそれぞれ環境変数に入れておく
- FRONT_CERT_ARN(Cloudfront用), ADMIN_CERT_ARN(管理画面用), ALB_CERT_ARN(ALB用)
cdk.ts
に設定されているパラメータを確認しておく(少なくともLB用のドメイン名は要修正※)cdk
ディレクトリよりnpm run deploy
でCDKスタックを投入する
この時点ではWordpressのコンテンツが存在しないためALBヘルスチェックがコケる
※Cloudfrontの転送先となる(つまり通常閲覧用の)ドメイン。管理画面用はここでは指定しない
この構成のEC2はプライベートサブネットに属しているため、インターネットや手元からファイルを送るには手元からscpする必要がある。(※)
そこで少々設定してEC2に手元からSSM SSHが通るようにする。
- AWSコンソールから対象インスタンスに「接続」する
- ec2-userの
~/.ssh/authorized_keys
に自分の公開鍵を入れる /etc/ssh/sshd_config
にてUsePAM yes
のコメントアウトを外してreloadする(なければそのまま)- 手元からSSM経由でsshできるように設定しておく
※ EC2にバックアップ用のS3からの読み取り権限を付与し、AWSコンソールからファイルアップ -> EC2からawscliで取得、という方法もある。頻繁にファイルをやり取りする場合や転送するファイルが大きい場合(SSM SSHは巨大なデータ転送に弱い)にはこちらの方法でも。
- wordpressコンテンツおよびDBダンプ(あれば)を用意し、手元から上記インスタンスにscpで転送する
- サーバにsshで入り、
/var/www/html
にコンテンツを展開する - 上記展開したコンテンツに対し
chown apache:apache
しておく wp-config.php
にDB情報を記載する(※1)(必要な情報はAWSコンソールのSecretManagerから参照する)wp-config.php
にHTTP_X_FORWARDED_PROTO
用の設定を追加する
if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS'] = 'on';
$_ENV['HTTPS'] = 'on';
}
- (既存からの移行の場合)DBダンプをRDSにリストアしておく
- 4-1で実施したsshまわりの設定を戻しておく(※2)
この時点でALBのドメイン経由でWordpressコンテンツが確認できるはず(初期投入ならインストール画面になる)
※1 パスワード内の記号のエスケープに注意; https://www.javadrive.jp/php/string/index4.html
※2 普段のメンテなどの作業はAWSコンソールから実施する想定
以下3点についてDNS設定を行う:
- Cloudfront(一般ユーザの閲覧用)
- ALB-1(Cloudfrontから受ける、一般ユーザの閲覧用。3. で指定したもの)
- ALB-2(管理画面アクセス用)
またAWSコンソールよりCloudfrontのDistributionを確認し、CNAMEsを設定しておく。
なおRoute53を使うのであればwebサイト全体の閲覧ヘルスチェックが設定できるはず。
SNSにinfraAlarm
というトピックができているため、適切にサブスクリプションを設定する。
メールでもLambda->slackでもChatbotでも。
- コンテンツ・DBバックアップをS3に取りたい
- 深夜バッチ的なやつ。EFSのドキュメントルート・DBダンプをS3に置く
- EC2にスクリプト配置&SSM & Lambdaで1台cronすればできるはず