ECSでデプロイしたアプリケーションのCloudFrontキャッシュをCodePipeline経由で安全にクリアする方法
概要
ECS(Elastic Container Service)でデプロイされた静的コンテンツを更新する際、CloudFrontのキャッシュが残っていると、古いコンテンツがユーザーに表示されるリスクがあります。特に、ローリングアップデートを行う際にキャッシュクリアを誤ったタイミングで実行すると、古いECSタスクが古いキャッシュを再生成してしまう可能性があります。
本記事では、この問題を防ぐために、CodePipelineの最後にCodeBuildを追加し、デプロイ後にCloudFrontのキャッシュクリアを安全に行う方法を紹介します。
この方法が役立つシチュエーション
-
静的コンテンツを頻繁に更新するWebアプリケーション
CloudFrontを介して静的コンテンツを配信しているWebアプリケーションで、HTMLやCSS、JavaScriptなどの更新が頻繁に発生する場合、キャッシュクリアが必要になります。 -
ローリングアップデートを行う際に、確実に最新のコンテンツを配信したい場合
デプロイ中に古いタスクがまだ動いていると、古いタスクが古いキャッシュを再生成してしまう可能性があります。これを防ぐために、デプロイ完了後にキャッシュをクリアすることが重要です。
システム構成図
+----------------------------+
| CodePipeline |
| |
| +---------------------+ |
| | Deploy to ECS | |
| +---------------------+ |
| |
| +---------------------+ |
| | CodeBuild (Clear | |
| | CloudFront Cache) | |
| +---------------------+ |
+----------------------------+
|
v
+----------------------------+
| ECS Cluster (Fargate) |
| |
| +---------------------+ |
| | New Task | |
| +---------------------+ |
| |
| +---------------------+ |
| | Old Task | |
| +---------------------+ |
+----------------------------+
|
v
+----------------------------+
| CloudFront |
| +---------------------+ |
| | Cache Cleared | |
| +---------------------+ |
+----------------------------+
実装フロー
-
CodePipelineのデプロイフェーズ
CodePipelineを使用してECSクラスタにデプロイを実行します。この際、ローリングアップデートにより新しいタスクが起動され、徐々にトラフィックが新しいタスクに切り替わります。 -
CodeBuildフェーズの実行
CodePipelineのデプロイが完了した後、CodeBuildが実行されます。buildspec.yml
に記載されたAWS CLIコマンドを使って、CloudFrontのキャッシュクリアを行います。 -
CloudFrontのキャッシュクリア
デプロイが完了し、すべてのトラフィックが新しいタスクに移行した後にキャッシュクリアが実行されるため、古いタスクが誤ってキャッシュを再生成することを防ぎます。
サンプル buildspec.yml
以下は、CloudFrontキャッシュクリアを実行するためのbuildspec.yml
の例です。
version: 0.2
phases:
install:
commands:
- echo "Installing dependencies if necessary"
build:
commands:
- echo "Starting CloudFront cache invalidation"
- aws cloudfront create-invalidation --distribution-id YOUR_DISTRIBUTION_ID --paths "/*"
post_build:
commands:
- echo "CloudFront cache cleared successfully"
必要な設定
YOUR_DISTRIBUTION_IDは、CloudFrontのディストリビューションIDに置き換えてください。
このファイルをCodeBuildプロジェクトに追加し、CodePipelineの最後のステージで実行します。