S3の静的ホスティングでwebページをデプロイされている場合に、CloudFront上のキャッシュが残ってしまうことで、更新した記事の反映に時間がかかってしまうことがあります。そこで、CloudFrontを能動的にクリアすることで更新を早めることができます。
本記事では、Githubにpushされた更新記事をきっかけにデプロイとCloudFrontのキャッシュクリアまでいっぺんに行ってしまおうという目的で実施します。
Actionsのテンプレート
Github ActionsからCloudFrontのキャッシュクリアをする際に使用するテンプレートはこちらを使用します。この情報をもとに必要情報の確認をしていきます。
AWS IAM Policy
このアクションを使うための最小権限としては、以下の設定をする必要があります。CloudFrontFullAccessなどでとにかく設定して機能を試したいというのもありかもしれませんがセキュリティは基本的には最小権限で設定することが望ましいので、CloudFrontのキャッシュクリアを行うだけならこの設定に従うのが良いと思います。 アカウントID(account id)とディストリビューションID(distribution ID)を個別に設定することで最小設定にすることができます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudfront:CreateInvalidation",
"Resource": "arn:aws:cloudfront::<account id>:distribution/<distribution ID>"
}
]
}
Action
Actionの使い方としては、以下の設定が必要です。シークレットとしてDISTRIBUTION、AWS_ACCESS_KEY_IDと、AWS_SECRET_ACCESS_KEYを設定しています。AWS_REGIONをハードコードしたくない場合はこちらもシークレットに登録しても良いと思います。PATHSはS3上のキャッシュクリアをしたいパスを指定するのでS3上のデプロイ先のディレクトリやファイル構成に合わせて変更する必要があります。
- name: Invalidate CloudFront
uses: chetan/invalidate-cloudfront-action@v2
env:
DISTRIBUTION: ${{ secrets.DISTRIBUTION }}
PATHS: "/index.html"
AWS_REGION: "us-east-1"
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
Configuration
シークレットやenvの設定情報は以下のテーブルで確認できます。DISTRIBUTIONはCloudFrontのディストリビューションIDを設定することになります。AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYは他のActionでも同じ名前で使われていることが多いので、変数名を独自に書き換えるよりもこのまま使う方が構築が楽かもしれません。
Param | Required? | Description |
---|---|---|
PATHS | yes* | A list of one or more space-separated paths to invalidate |
PATHS_FROM | yes* | Filename to read list of paths from |
DISTRIBUTION | yes | CloudFront distribution ID to operate on, e.g., ‘EDFDVBD6EXAMPLE’ |
AWS_REGION | yes | AWS Region to operate in |
AWS_ACCESS_KEY_ID | yes | Access key with necessary permissions to invalidate objects in the target distribution (see below) |
AWS_SECRET_ACCESS_KEY | yes | Secret key |
DEBUG | no | When set to “1”, prints the final awscli invalidation command for troubleshooting purposes |