Featured image of post Github Actions + CloudFrontのキャッシュクリア

Github Actions + CloudFrontのキャッシュクリア

Github Actionsを使ってCloudFrontのキャッシュクリアを自動的に行えるようにします。S3 + CloudFrontでSPAを作っている方におすすめです。

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
Licensed under CC BY-NC-SA 4.0