AWS CloudFrontのキャッシュの無効化 (AWS_CloudFrontプラグイン)

静的ファイルのパブリッシュ・削除と連動して AWS CloudFront のキャッシュを無効化します。

AWS CloudFrontのキャッシュをパージ


AWS_S3プラグインと併用が可能です。AWS_S3プラグインと併用する場合、ファイルの更新・削除後に S3へ同期、その後にキャッシュを無効化リクエストを送信します。
このプラグインは PowerCMS X ver.2.6 以上が必要です。
月間 1,000 パス以上の無効化リクエストには料金が発生します。予算に上限のある場合、「無効化リクエストの送信数を減らすために」の内容に従い適切に設定を行ってください。

参考記事

制限事項

このプラグインによって無効化リクエストが送信されるのは PowerCMS X によって出力・削除されたファイルに対してのみとなります。FTPなどで直接設置・削除したファイルは対象外となります。
また、パラメタ付きURLについては「ルート相対パスとパージ対象パスのマッピング」設定によりクリアできる場合を除き無効化対象とはなりません。

リンクURL機能を使ってプレビューリンクを追加する

スコープの設定で「リンクURL」に CloudFrontのURLを入力して、「」にチェックを入れて設定を保存すると、管理画面にリンクが追加されます。

リンクURL機能を使うと公開ファイルへのリンクを追加できます

設定・環境変数の設定

AWS SDK for PHP をインストールします。パスは include_path の配下であればどこでも構いません(autoload.phpのパスを環境変数 composer_autoload に指定します)。

$ composer require aws/aws-sdk-php

AWS_CloudFrontプラグイン用の環境変数を指定します。config.jsonに記述する場合は、Web経由で config.jsonにアクセスできないように制限をかけてください。

  1. composer_autoload : composerでインストールしたパスの autoload.phpのパスを指定します。
  2. aws_cloudfront_api_version : 初期値は「2019-03-26」です。
  3. aws_cloudfront_api_interval : APIコールの実行間隔をミリ秒で指定します。初期値は 1000です。
  4. aws_cloudfront_bulk_per : 複数のキャシュをパージするとき、1度の APIコールで最大どれだけのパスを送信するかを指定します。初期値は 100です。
  5. aws_cloudfront_queue_delay : キューの実行開始までの待ち時間を秒で指定します。初期値は 1800(30分)です。この間に同一ファイルが更新された場合、そのファイルのパージのための無効化リクエストは1回で済みます。
  6. aws_cloudfront_maxpurge_per_once : 1度の処理(管理画面操作もしくはスケジュールタスク)での最大無効化リクエスト数の上限を指定します。この数字を超える無効化リクエストはすべての無効化リクエスト(「/*」)にまとめられます。初期値は 15です。
  7. aws_cloudfront_maxpurge_per_month : 月間の無効化リクエスト数の上限を指定します。「-1」を指定すると上限はなくなります。初期値は 1000です。無効化リクエスト数が月間 1000以内の時、無効化リクエストに対する料金はかかりません。この数値を超えた時、キャッシュはクリアされなくなります。
  8. aws_cloudfront_realtime_purge : ファイル更新・削除時に、リアルタイムでキャッシュをパージする時に「true」とします。初期値は「false」で、falseの時、処理はキューに登録され、次回の定期実行タスク実行時に行われます。
  9. aws_cloudfront_purge_dynamic : ダイナミック・パブリッシング及びファイル出力が「オンデマンド」のアーカイブの更新時にキャッシュをパージします。初期値は trueです。
  10. aws_cloudfront_purge_directry_without_slash : ディレクトリ・インデックスファイル名の設定のある時、「/dirname/index.html」が更新された時、「/dirname/」とあわせて「/dirname」に対するキャッシュをパージします。初期値は falseです。
  11. aws_cloudfront_inherit_S3_extensions : AWS_S3プラグインが有効の時、拡張子に関する設定を継承します。初期値は trueです。
        "aws_cloudfront_api_version": "2019-03-26",
        "aws_cloudfront_api_interval" : 1000,
        "aws_cloudfront_bulk_per" : 100,
        "aws_cloudfront_queue_delay" : 900,
        "aws_cloudfront_maxpurge_per_once" : 15,
        "aws_cloudfront_maxpurge_per_month" : 1000,
        "aws_cloudfront_realtime_purge": false,
        "aws_cloudfront_purge_dynamic" : true,
        "aws_cloudfront_purge_directry_without_slash" : false,
        "aws_cloudfront_inherit_S3_extensions" : true

※ 「composer_autoload」の指定がないとプラグインを有効化できません
※ 環境変数「denied_exts」に指定されている拡張子は 環境変数「denied_exts」の初期値 別ウィンドウで開きます でご確認ください。 ※「aws_cloudfront_realtime_purge」指定のある時も、実際の処理は __destruct (非同期処理を含むすべての処理が行われた後) に実行されるため、多少のタイムラグが生じます。
※「AWS_S3」をあわせて利用している時、「aws_cloudfront_realtime_purge」指定のある時も、キューによって S3に同期するファイルに対するキャッシュのパージは同期時点で行われます。
※「AWS_S3」をあわせて利用している時、「aws_s3_exclude_exts」または「denied_exts」指定の拡張子のファイル更新は無視されます。
※ 「aws_cloudfront_maxpurge_per_month」に対する月間の無効化リクエスト数については、ログから算出します。ログが削除されているとコール数の算出が不正確になりますのでご注意ください。また、実際の利用状況と月間の無効化リクエスト数が異なることがありますので、正確な利用状況は必ず AWSのコンソール 別ウィンドウで開きます で確認してください

プラグイン設定

プラグインを有効化し、設定を行います。プラグイン設定は、システム、スペースなどのスコープごとに設定します。

  • アクセスキー(システムのみ) : APIへアクセスするためのアクセスキーを登録します。
  • シークレットアクセスキー(システムのみ) : APIへアクセスするためのシークレットアクセスキーを登録します。
  • システム設定を利用(スペースのみ) : システムの設定をスペースで継承する時にチェックします。
  • ディストリビューションID : AWS CloudFront のディストリビューションIDを指定します。指定のないスコープでは何の処理も行いません。
  • リージョン : リージョンを指定します。初期値は「ap-northeast-1」(東京リージョン)です。
  • 無効化のトリガー : ファイル更新時、ファイル削除時にキャッシュをパージするかを指定します。「パスを指定して無効化」を指定すると、プラグイン設定画面でパスを指定して手動で無効化リクエストを送信できます。
  • ディレクトリ・インデックスファイル名 : 初期値は「index.html」で、「/dirname/index.html」が更新された時、「/dirname/」のキャッシュをあわせてパージします。
  • ディレクトリのみを無効化 : 「/dirname/index.html」が更新された時「/dirname/」のキャッシュのみを無効化し「/dirname/index.html」については無効化を行いません。
  • ルート相対パスとパージ対象パスのマッピング : 例えば「/search.html,/search.html*」「/contents/*,/search.html*」「*」を指定することでパラメタ付きリクエストのキャッシュもあわせてクリアすることができます。またはカンマで区切らずに単に「/articles/*」のように指定できます(無効化リクエストをまとめることができます)。
  • 除外パターン : ファイル更新・削除時にパージ対象外とするルート相対パスのパターンを指定します。例えば「^/page_url.html」「^/dirname/*」「.png$」のように指定できます。
  • 除外するURLマップID : 除外するURLマップのIDをカンマ区切りで指定します。

無効化リクエストが送信されるタイミング (設定により異なる)

  • ファイルが更新された時 (ページの内容に変更があってパブリッシュされた、もしくは上書きアップロードされた時)
  • ファイルが削除された時
  • パスを指定してパージした時
  • task_ids に「aws_cloudfront_purge_cache」を指定して worker.php を実行した時

すべてのキャッシュに対する無効化リクエストを送信する

task_ids に「aws_cloudfront_purge_cache」を指定して worker.php を実行することで、すべてのキャッシュに対する無効化リクエストを送信します。

$ cd /path/to/PowerCMSX; sudo -u apache php ./tools/worker.php --verbose --task_ids aws_cloudfront_purge_cache 

無効化リクエストの送信数を減らすために

Amazon CloudFrontの無効リクエストの利用料金については AWSのドキュメントを参照ください。

1か月に最初の 1,000 件の無効化パスを送信するのは無料です。それ以降は、無効化要求されたパスごとに 0.005 USD が課金されます。(2023年4月現在)

予算に上限を設けない場合

環境変数「aws_cloudfront_maxpurge_per_month」に「-1」を指定すると、上限なく無効化リクエストを送信します。
「aws_cloudfront_realtime_purge」を指定すると、キャッシュパージまでの時間が最も短くなります。常に最新の情報を返す必要のあるケースで指定してください。

以下に、無効化リクエストの数を減らして料金が想定外にかからないための設定や運用方法について説明します。

予算を設定して無効化リクエストにかかる費用を抑えたい場合のヒント

※「aws_cloudfront_maxpurge_per_month」に対する月間の無効化リクエスト数はプラグイン設定画面で確認できます。ただし、この数字については、ログから算出します。ログが削除されているとコール数の算出が不正確になりますのでご注意ください。また、実際の利用状況と月間の無効化リクエスト数が異なることがありますので、正確な利用状況は必ず AWSのコンソール 別ウィンドウで開きます で確認してください

プラグイン設定で「除外パス」を適切に設定する

個別のコンテンツを無効化リクエストから除外するのであれば、たとえば「/contents/*」「/articles/*」などのようにワイルドカードを使ってディレクトリ配下のコンテンツを除外します。 「.php$」のように指定すると拡張子の除外設定も可能です。

プラグイン設定「除外するURLマップID」で除外対象を指定する

除外するURLマップのIDをカンマ区切りで指定します。単一コンテンツの更新時にトリガーなどにより多くのファイルが更新される時、日付アーカイブやトップページ以外の一覧系のページなど比較的アクセスの少ないページに指定するとよいでしょう。

プラグイン設定の「ルート相対パスとパージ対象パスのマッピング」で無効化リクエストをまとめる

「除外パス」の代わりに「ルート相対パスとパージ対象パスのマッピング」にワイルドカード付きのパスを指定することで、無効化リクエストをまとめることができます。 例えば、カンマで区切らずに単に「/articles/*」のように指定すると、「/articles/2021/09/entry1.html」「/articles/2021/09/entry2.html」が同時に更新された時も無効化リクエストは「/articles/*」の 1つだけ作成されます。
最も極端な例では「/*」のみ設定すれば、コンテンツの更新があったたびに更新ファイルの数にかかわらず 1リクエストのみが作成されます。

プラグイン設定で「無効化のトリガー」の設定を状況に応じて変更する

コンテンツの更新などでまとまった作業を行うときは「ファイル更新時」「ファイル削除時」のチェックを外しておき、作業が終わったところで、「/*」パスを指定して無効化することで無効化リクエストをまとめることができます。

キューの開始時間を遅らせる

環境変数「aws_cloudfront_queue_delay」でキューの実行開始までの待ち時間を秒で指定します。初期値は 1800(30分)です。この間に同一ファイルが更新された場合、そのファイルのパージのための無効化リクエストは1回で済みます。
この環境変数を「3600」などと長くすることで、同一ファイルが頻繁に更新される時の無効化リクエストの回数を減らすことができます。

プラグイン設定でディレクトリのみを無効化

「/dirname/index.html」が更新された時「/dirname/」のキャッシュのみを無効化し「/dirname/index.html」については無効化を行わないことでリクエスト数を減らします。

1回あたりの無効化リクエスト数に上限を設ける

環境変数「aws_cloudfront_maxpurge_per_once」の指定数を超える無効化リクエストは「/*」にまとめられます。初期値は「15」です。この数字を小さくすることで無効化リクエストの発行回数を減らすことができます。

※ いずれにしても、無効化リクエストの発行回数とリアルタイムに確実にキャッシュをコントロールすることは相反する要求事項となりますので、コストと効果のバランスを見ながら各パラメタを設定してください。


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