PowerCMS X ブログ

2023-12-28

Amazon S3 / CloudFrontを経由して静的ウェブサイトを配信する (その2)

この記事は2年前に書いた記事のアップデート版です。リリースから2年、実際にいくつかのサイトの構築・運用を行う中でわかってきたいくつかの課題に対して機能のアップデートを重ねてきており、そのあたりを中心にご紹介します。

PowerCMS X ver.3.x 別ウィンドウで開きます で追加された AWS_S3 / AWS_CloudFrontを利用することで、PowerCMS Xで生成した静的ファイルを Amazon S3 / CloudFrontを経由して配信することができます。同期は自動的に行われるため、運用時に特別な操作をする必要はありません。

AWS側の設定 / プラグインの導入についてはこの記事では割愛します。下記のドキュメントなどを参照いただき、Amazon S3で静的ウェブサイトをホスティングする設定を行い、CloudFrontのオリジンに Amazon S3を指定してください(もちろん、AWS_S3プラグインを使わず、EC2( CMSサーバー )をオリジンとして運用することもできます)。

構成図

プラグインの導入・設定方法は以下を参照ください。

S3バケットのオブジェクト一覧を確認できる機能を追加

AWS マネジメントコンソールに入らなくても PowerCMS Xの管理画面でファイルの一覧を表示できるようになりました。API経由でデータリストを取得します。

S3のオブジェクト一覧画面

検索、S3バケットからのファイル削除、実際のS3のデータを確認できます。

新しくなったプラグイン設定・AWS Elemental MediaConvertとの連携

拡張子によって同期先のバケットを変更できるようになりました。以下の環境変数で有効化できます。

  • aws_s3_use_custom_mapping : AWS_S3プラグインで拡張子ごとに同期先を変更する設定を有効化する
  • aws_s3_use_mediaconvert : AWS_S3プラグインで「AWS Elemental MediaConvert」のキューを確認できるようにする

具体的には、MP4の動画をAWS Elemental MediaConvertと連携させたS3バケットに同期するようにする、などの時、特定の拡張子のファイルを別指定した S3バケットに同期でき、また、AWS Elemental MediaConvertのジョブを管理画面で確認することができます。

新しくなったプラグイン設定

URL一覧から特定のパスのキャッシュ無効化リクエスト・S3同期を行えるように

実際にサイトが運用フェーズに入ると「このページ・この画像だけキャッシュを無効化したい」「このファイルは削除したい」などというケースがしばしば出てきます。PowerCMS Xはすべての URLをデータベース管理しているので、URLオブジェクトの一覧画面に2つのアクションを追加しました。URL一覧画面からS3同期・キャッシュ無効化リクエストを送信できます。

  • AWS S3へのファイル同期 : ファイルが存在するものは即時アップロード・削除フラグ付きのものは S3から削除
  • AWS CloudFront キャッシュ無効化 : CloudFrontへのキャッシュ無効化リクエストを送信

URL一覧画面からS3同期・キャッシュ無効化リクエストを送信できる

これまでもAWS_CloudFrontプラグインの設定画面でパスを個別に指定して無効化リクエストを送信することができましたが、URLを検索してそこから同期や無効化リクエストを送信できるので、直感的に操作することができると思います。

S3へのファイル同期を非同期で実行する

S3へのファイルの同期はこれまではリアルタイムか、キュー経由で実行される2種類の設定が選択できましたが、バッチによる同期も可能になりました(すべてを同期するバッチは用意されていましたが、より細かな指定が可能になりました)。

例えば、以下のようなバッチを15分おきに起動するように設定した場合「過去20分以内に作成・更新・削除されたファイル」を対象に同期を実行します。

sudo -u apache php ./tools/worker.php  --task_ids aws_s3_synchronize_s3 --modified_only --update_from '-20 minute' 

以下の環境変数でカスタマイズが可能です。

  • aws_s3_realtime_sync : 同期をリアルタイムで実行する (初期値 true)
  • aws_s3_worker_only : 管理画面操作などでは同期は行われず、バッチ(スケジュールタスク)でのみ同期を実行する (初期値 false)
  • aws_s3_skip_rebuild_phase : リアルタイムで同期するが、ポップアップウィンドウでの再構築の時は同期を行わない

最後の「aws_s3_skip_rebuild_phase」ですが、ポップアップウィンドウでの再構築で大量のファイルがアップデートされ同期されると、負荷が高くなるのを避けるための設定です。上記のようなバッチを定期的に起動するようにしておくことで、または全体のデザイン変更などの時は再構築後に手動でバッチを叩いて同期する、などの運用が可能になります。

また、以下のようにバッチを起動すると、S3のオブジェクトと CMSのローカルファイルを比較して、タイムスタンプの新しいもの、S3に同期されていないもの、S3に存在するが CMSのディスクから消えているもののみを対象に同期を行います。毎日深夜に1度起動する、障害からの復旧時に起動するなどの使い方ができます。--classes、--exclude_classesパラメタが指定できるため、例えば冗長化構成の時、2台で負荷を分散させるような設定も可能です。

sudo -u apache php ./tools/worker.php  --task_ids aws_s3_synchronize_s3 --modified_only # --classes archive

 

※ AWS、Amazon S3 / CloudFront / Elemental MediaConvertは、AWS の米国およびその他の国における登録商標です。

ブログ内検索

アーカイブ