CloudFrontのキャッシュを定期的に自動削除してみた

2022.10.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、コンサル部@大阪オフィスのTodaです。

Amazon CloudFrontをご利用頂く中で、オリジン側のコンテンツ内容変更にともないキャッシュをクリアしたいというご要望がございます。
AWS マネジメントコンソールを使う場合、対象のCloudFront内の「キャッシュ削除」で対応可能ですが、 毎週決まった時間にキャッシュ削除をする場合、定期処理で自動削除できるようにしたいと考えました。
今回は、Lambda処理を利用して自動削除出来るようにしてみます。

実現する事

  • 毎週決まった時間に指定のCloudFrontのキャッシュをクリアする
  • クリアの範囲は「/*」にて全てを指定

試してみる

Lambda関数作成

Python 3.9にてLambda関数を作成します。
プログラムのコードは下記内容になります。

import os
import boto3
import time

def lambda_handler(event, context):
    cloudfront  = boto3.client('cloudfront')

    invalidation = cloudfront.create_invalidation(DistributionId=os.environ['DistributionId'],
        InvalidationBatch={
            'Paths': {
                'Items': ['/*'],
                'Quantity': 1
            },
        'CallerReference': str(time.time())
    })

対象のCloudFront指定は環境変数で指定するようにします。
タブメニューから[設定]を選択いただき、左メニューから[環境変数] > [編集]をクリックします。

Lambda関数作成1

「DistributionId」のキーにてCloudFrontのIDを指定して保存をおこないます。

Lambda関数作成2

IAMロールの設定変更

CloudFrontのキャッシュクリアをする場合、IAMロールの調整が必要になります。
現在設定されているIAMロールに権限を追加します。
タブメニューから[設定]を選択いただき、左メニューから[アクセス権限] > [ロール名]をクリックします。

IAMロールの設定変更1

IAMロールの詳細画面にて[許可を追加] > [ポリシーをアタッチ]をクリックします。

IAMロールの設定変更2

ポリシーが一覧で表示されますので「CloudFront」で検索をおこない、[CloudFrontFullAccess]をアタッチするようにします。
選択後は画面下の[ポリシーのアタッチ]にて設定を完了します。

IAMロールの設定変更3

動作確認

IAMロールが設定出来た時点で、Lambdaのテスト処理にて動作が出来るかの確認をします。
テストイベントでは特に引数を渡す必要もございませんので「hello-world」のテンプレートを利用して実行をします。

動作確認1

動作確認2

実行をおこないCloudFront側でキャッシュ削除がおこなわれていることを確認します。

動作確認3

トリガー設定

テスト処理が正常に出来ていることを確認したらトリガーを設定して定期実行できるように設定します。
関数の概要に表示されている[トリガーを追加]をクリックします。

トリガー設定1

EventBridgeを選択してルール名とスケジュールを指定します。
今回「Cron形式」にて設定をしていますが、指定はUTC時刻となるため日本時間から-9:00した時刻を指定します。
例: 毎週月曜日のAM6:00の場合「cron(0 21 ? * SUN *)」となります。

トリガー設定2

トリガーの追加を完了します。
上記にて、定期処理の設定が完了いたしましたので、定期処理の実行されるタイミングにてCloudFront側でキャッシュ削除が出来ていることを確認します。

さいごに

今回はCloudFrontのキャッシュを自動削除する処理をLambdaで実装してみました。
Lambdaで処理を作成していますのでトリガーを変えることでオリジンのファイルが置き換わったときにキャッシュをクリアするなど処理を作る事も可能になります。

少しでもお客様の参考になればと考えております。