0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[AWS] S3を更新するたびにCloudFrontのキャッシュが自動で削除されるようにしたい。

Last updated at Posted at 2025-02-01

s32.jpg

前提

こんな感じの構成で静的なWebサイトを運用していて、
S3バケット内のファイルを更新するたびに
CloudFrontのキャッシュクリアを手動で作成しなければならず
非常にストレスを感じている人向けです!!!

zentei01.jpg

※ 上記の作り方がわからない方は以下
https://qiita.com/GeneLab_999/items/e34a01af3f39f2d544b6

※ この方法は時間がない時の簡易的なやりかたです。ほんとは以下みたいな方法でやった方が良いです。
https://qiita.com/GeneLab_999/items/017af937345c39e64ecb

完成図

CloudFrontのキャッシュを無効化するLambdaを作って、
S3ファイル変更を検知してイベント通知をその関数に飛ばして自動化する!

kansei01.jpg

1.Lambda関数の作成

1-1.関数の作成

Lambda関数の新規作成画面に来たら以下の設定で関数を作成する。
1から作成 を選択し、以下のように設定をする。

項目
関数名 任意の名前 (例:CacheClearCF)
ランタイム Python3.12
アーキテクチャ arm64
デフォルト実行ロール 基本的な Lambda アクセス権限で新しいロールを作成
その他の構成 デフォルト設定でOK

スクリーンショット 2025-02-01 17.20.40.png

1-2.コードのデプロイ

先の設定にてLambda関数'CacheClearCF'新規作成したら、
'CacheClearCF'コードソースからのlambda_function.pyに以下のコードを挿入し
Deployを実行する。

スクリーンショット 2025-02-01 17.26.27.png

import json
import boto3
import os
from datetime import datetime

# CloudFrontのディストリビューションIDは環境変数などで管理
CLOUDFRONT_DIST_ID = os.environ.get('CLOUDFRONT_DIST_ID')
client = boto3.client('cloudfront')

def lambda_handler(event, context):
    # event 内に S3 の情報が入っているので、必要に応じて処理
    paths = []
    for record in event.get('Records', []):
        s3_info = record.get('s3', {})
        object_key = s3_info.get('object', {}).get('key')
        if object_key:
            # CloudFront で無効化するパスの形式に合わせる
            paths.append('/' + object_key)
    
    # 重複除外や必要なパスをまとめる
    if not paths:
        return {
            'statusCode': 200,
            'body': json.dumps('No paths to invalidate.')
        }

    # CreateInvalidation API を呼び出す
    caller_reference = str(datetime.utcnow().timestamp())
    invalidation = client.create_invalidation(
        DistributionId=CLOUDFRONT_DIST_ID,
        InvalidationBatch={
            'Paths': {
                'Quantity': len(paths),
                'Items': paths
            },
            'CallerReference': caller_reference
        }
    )

    return {
        'statusCode': 200,
        'body': json.dumps(f"Invalidation created: {invalidation['Invalidation']['Id']}")
    }

1-3.環境変数の設定

Lambda 関数内のコードで参照している CLOUDFRONT_DIST_ID を設定する。
キー: CLOUDFRONT_DIST_ID
値: 対象のCloudFrontディストリビューションID

1-4.アクセス権限を追加

AWSのサービス を選択し、他は以下のように入力する。

項目
サービス S3
ステートメントID <任意の命名: 例: AllowS3InvokeLambda>
プリンシパル s3.amazonaws.com
ソースアカウント <自身のAWS アカウントID(12桁の数字)>
ソース ARN <対象のS3バケットのARN>
アクション lambda:InvokeFunction

スクリーンショット 2025-02-01 17.48.26.png

1-5.ポリシーを編集

1-5-1.コンソールで対象のロールを開く

対象のLambda関数のコンソールから、設定(タブ)/ アクセス権限(タブ) / と進む
実行ロールの項目内にロール名というタイトルでリンクがあるはずなので、それをクリックすると、
IAMのコンソール画面へ移動する。

1-5-2.インラインポリシーを作成

アクセス管理 / ロール / 許可(タブ) / 許可ポリシー /と進むと
許可を追加というプルダウンがあるので、そこでインラインポリシーを作成を選択する。
スクリーンショット 2025-02-01 18.32.28.png

スクリーンショット 2025-02-01 18.39.35.png

JSONタブを選択し、以下のように入力する。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "cloudfront:CreateInvalidation",
      "Resource": "arn:aws:cloudfront::<あなたのAWSアカウントID>:distribution/<対象のディストリビューションID>"
    }
  ]
}

次の画面に進んだら、任意のポリシー名(例: Policy_CashClearCF)を設定し、「ポリシーの作成」ボタンをクリックし、この設定を完了させる。

スクリーンショット 2025-02-01 18.42.17.png


2.S3 イベントの設定

2-1.対象のオブジェクト更新を検知するようにイベント通知」を設定

このイベントが Lambda 関数を起動するように設定します。

[階層] AMAZON S3/バケット/プロパティ(タブ)/
[操作] イベント通知を作成 ボタンをクリック
スクリーンショット 2025-02-01 16.59.24.png

2-2.イベント通知を作成画面

一般的な設定

スクリーンショット 2025-02-01 17.10.31.png
・イベント名
 └ 何でも良い。今回は CloudFrontInvalidationTrigger とした。

・プレフィックス
 └ すべてのオブジェクトに対してイベントを発火させる場合は空欄のままで大丈夫。
※もし特定のディレクトリ(例: assets/ や static/)のみ更新対象にしたい場合は、そのディレクトリ名 (末尾にスラッシュ「/」を含める)を設定。
・サフィックス
 └ 全てのファイルを対象にするなら空欄でOK。
※特定の拡張子(例: .html や .css など)だけに限定したい場合は、その拡張子を設定。

イベントタイプの設定

スクリーンショット 2025-02-01 18.07.58.png

以下の2つをチェック
s3:ObjectCreated:*
s3:ObjectRemoved:*

送信先

スクリーンショット 2025-02-01 18.05.48.png
送信先
Lambda関数 をチェック

Lambda関数
先ほど作成したLambda関数を選択

その他

デフォルトで問題なし。
変更を保存 ボタンで新規作成が完了する。

3.テスト

3-1.S3バケットのファイルを更新

実際のサイトを見てみて、対象のファイルが更新できていたらOK!
うまくかなかったらCloudWatch Logsをチェックしてみてね!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?