【EC2】WordPress サーバーを Auto Scaling (最小構成)

概要

こんな構成で WordPress サーバーをオートスケーリングしてみたお話です。

手順

EC2 + RDS + S3 を使用した、(ほぼ) ステートレスな WordPress のゴールデンイメージ (AMI) 作成

下記のページ等を参考に EC2 + RDS + S3 を使用した、(ほぼ) ステートレスな WordPress サーバーの EC2 インスタンスを構築し、その AMI を作成。 この AMI をゴールデンイメージとする。

ゴールデンイメージ?

ゴールデンイメージとは、 スケールアウト時に起動するマシンの元となるイメージ (EC2 の場合は AMI) を指す。
スケールアウト / スケールイン時の任意のタイミングでインスタンスが生成 / 廃棄されるので、サーバー内に固有の状態を持たないように (ステートレスで) 構成する必要がある。

……というと難しいそうに聞こえるが、サーバー内に消されては困るデータを永続的に保存しないようにする以外は、普通に AMI を作ればいいだけの話。

ALB のターゲットグループ作成

通常アクセス時用のターゲットグループ

こちらのターゲットは Auto Scaling に管理してもらう。

管理画面アクセス時用のターゲットグループ

こちらは特にスケーリングする必要がないので手動管理。

イメージ更新時に使えるように、ゴールデンイメージ作成時のインスタンスでも登録しておこう。

ALB 作成

ALB を選択。

実運用時は必要に応じて HTTPS のリスナーも追加しておこう (今回は手抜き)。

必要な AZ を選択。

とりあえず、先ほど作成した通常アクセス時のターゲットグループを選択して作成。

ルールの表示/編集を押下。

追加ボタンを押下して、/wp-admin/*/wp-login.php のルールを追加 (管理画面アクセス時のターゲットグループに転送)。

起動テンプレート作成

スケールアウトする際に起動するインスタンスの複製元として使用するゴールデンイメージと、その起動設定。

新規テンプレートの作成。

ゴールデンイメージの AMI ID を指定。その他、いつもインスタンス作成時に指定するインスタンスタイプやキーペアなどお決まりの設定。

ネットワークインタフェース部分は、指定しなくても 1 つ自動的に作成されるので、基本的に指定しなくても大丈夫。
ストレージも AMI 作成時の構成でルートボリュームが作成される。

作成したインスタンスに付与するタグの設定。

高度な詳細は……そのまま放置でいいのでは。

オートスケーリンググループ作成

さて、ようやく本題です……。

先程作成した起動テンプレートを指定。 最近は起動設定ではなく起動テンプレート推しらしいです。

諸々の設定。 ここのグループサイズが初期インスタンス数となる。

先程作成した ALB の通常アクセス時用のターゲットグループを、このオートスケーリンググループに管理してもらうのでそのように設定。

ここが肝。 スケーリング方法とスケール範囲を指定。

スケーリングポリシーはいくつかあるが、AWS 的にはターゲット追跡スケーリングポリシーがおすすめらしいのでそれを使用。

その他、生成したインスタンスに付与するタグやイベント発生時の通知なども設定可。

動作確認

負荷をかけた状態でしばらく放置し、ちゃんとスケールアウトすることを確認。

$ yes >> /dev/null &

SSH ログイン後、シェルへ上記コマンドを打ち込むと CPU 負荷をかけることができる (ただし、CPU コア数分並列実行しないと 100% にはならない)。

ちゃんと増えた。 自動生成された CloudWatch アラームは 3 分間 内の 3 データポイントに対する CPUUtilization (CPUUtilization) > 80 という定義だったが、だいたいそんな感じになってる。

この構成の制限

下記に関して留意する必要がある。

  • ファイル変更が同期されないため下記は厳しい(ゴールデンイメージを都度更新する必要がある)
    • プラグイン、テーマを管理画面からインストール
    • WordPress コアやプラグインのアップデート
    • 自動アップデートはどうしましょうか……
  • サーバー内のログがスケールイン時に消える
  • アプリケーションが生 WordPress 想定なので、セッションストアの共有については考慮してない
    • PHP のセッションを使うようなカスタマイズしていたり、プラグインをインストールしている場合、ElastiCache 等を要検討

おわりに

ここまで書いておいてアレですが、よほどのことがない限りスケールアウト目的で WordPress に AutoScaling って必要無いような気がする。CloudFront を前段に置けばだいたい間に合いそうな……。