Amazon EventBridge SchedulerでCloudFrontのキャッシュクリア自動化を試してみました(Lambda不使用)

Amazon EventBridge Schedulerを試してみました! これまで EventBridgeからLambdaを呼び出していたようなアクションも、Schedulerだけで完結できるものがありそうです! 可能性を感じますね!
2022.11.16

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

こんにちは。AWS 事業本部コンサルティング部に所属している今泉(@bun76235104)です。

先日にAWSの新機能としてAmazon EventBridge Schedulerがリリースされました。

非常に多くのサービスと連携しており、弊社でもさまざまな使い方が考えられているところで、非常に可能性を感じます。

従来であればLambdaを作成するなどの方策が必要だった「CloudFrontのキャッシュクリアの自動化」をAmazon EventBridge Schedulerを使って簡単に実装してみました。

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

下準備:CloudFrontを立てる(S3オリジン)

まずはCloudFrontのディストリビューションを作成しました。

以下のようにS3をオリジンとしています。

20221116_event_scedular_cloud_front_cache_architecture

S3には以下のようにJSONファイル(test.json)を配置しておきます。

{
  "famous_words": [
    {
      "char": "pop",
      "words": "一瞬…!!だけど…閃光のように…!!!まぶしく燃えて生き抜いてやる!!!"
    },
    {
      "char": "pop",
      "words": "・・・そう!!おれを呼ぶなら大魔導士とでも呼んでくれっ!!!"
    },
    {
      "char": "dai",
      "words": "・・・おまえは昔から天才だよっ!!ポップ!!!"
    }
  ]
}

CloudFrontにリクエストを送って、ちゃんとキャッシュされているか確かめてみます。

curl https://${ディストリビューションのドメイン名}/test.json

レスポンスBodyは以下のように意図したJSONが返却されました。

{
  "famous_words": [
    {
      "char": "pop",
      "words": "一瞬…!!だけど…閃光のように…!!!まぶしく燃えて生き抜いてやる!!!"
    },
    {
      "char": "pop",
      "words": "・・・そう!!おれを呼ぶなら大魔導士とでも呼んでくれっ!!!"
    },
    {
      "char": "dai",
      "words": "・・・おまえは昔から天才だよっ!!ポップ!!!"
    }
  ]
}

また、初回のリクエストであったためレスポンスヘッダを確認したところCloudFrontにキャッシュが無いようです。

HTTP/2 200
# 略
server: AmazonS3
x-cache: Miss from cloudfront
# ↑キャッシュがヒットしなかった

何度かリクエストをするうちに、キャッシュヒットするようになったことを確認しました。

server: AmazonS3
x-cache: Hit from cloudfront
# ↑キャッシュヒットした

これで下準備は完了です。

次はAmazon EventBridge Schedulerを使ってキャッシュクリアの自動化を実装していきます。

Amazon EventBridge Schedulerでスケジュールを組む

まずはAWSマネジメントコンソールのAmazon EventBridgeのダッシュボードからSchedulesの画面に移動します。

20221116_eventbridge_schedular_cloudfront_step1

次にスケジュールの作成画面に遷移します。

20221116_event_bridge_schedular_cloudfront_step2

入力欄にスケジュール名や説明などを入力していきます。

今回は以下画像のように5分間隔の実行をしていしてみました。

20221116_eventbridge_schedule_cloudfront_step3

CloudFrontをターゲットとして選択します。

20221116_eventbridge_schedule_cloudfront_step4

CloudFrontのCreateInvalidationをターゲットとして選択します。

20221116_eventbridge_schedule_cloudfront_step5

次にAPIに渡すパラメータを定義するJSONを作成します。

20221116_eventbridge_schedule_cloudfront_step6

今回は以下のように指定しています。

{
  "DistributionId": "ディストリビューションのID",
  "InvalidationBatch": {
    "CallerReference": "auto-<aws.scheduler.scheduled-time>",
    "Paths": {
      "Quantity": 1,
      "Items": ["/*"]
    }
  }
}

なお、aws.scheduler.scheduled-timeはEventBridge Schedulerで利用できるキーワードです。

呼び出し時の時間に置き換えてくれます。

他にもいくつかキーワードを用意してくれていますので、興味のある方はご確認ください。

「次へ」をクリックします。

次に以下のようにスケジュールの設定画面に遷移します。

今回は再試行ポリシーなどは特に設定していませんが、アクセス許可であらかじめ作成していたIAMロールを選択しています。

20221116_eventbridge_schedule_cloudfront_step7

IAMロールは以下のようにポリシーと信頼ポリシーを設定しています。

IAMポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": "cloudfront:CreateInvalidation",
            "Resource": "arn:aws:cloudfront::${アカウントID}:distribution/${ディストリビューションID}"
        }
    ]
}

信頼ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

確認画面で問題なければ、「スケジュールを作成」をクリックします。

20221116_eventbridge_schedule_cloudfront_step7

確認

7分後くらいにCloudFrontのディストリビューションを確認したところ、きっちりキャッシュ削除が行われていました。

20221116_eventbridge_schedule_cloudfront_step9

curlでもキャッシュヒットしていないことが確認できました!

server: AmazonS3
x-cache: Miss from cloudfront

また、5分後に確認してもキャッシュが削除されていることを確認できました。

このままだと5分ごとにスケジュールが走るので、忘れずにスケジュールを無効化します。

まとめ

  • CloudFrontのキャッシュクリアのスケジュール化がLambdaいらずで実装できた
  • Amazon EventBridge Schedulerには大いなる可能性がある