3
2

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キャッシュ削除を自動化する

Posted at

はじめに

webアプリを作成している際、S3バケットの静的ファイルを更新したのにCloudFrontのキャッシュが残っていて、更新が反映されないという経験はありませんか?
私はこれまで更新した際に、いちいちCloudFrontのキャッシュ削除を手動で行っていました。今回はこれを自動化してみます。

構成

画像のように、S3バケットにファイルをアップロードした際に、Lambda関数をトリガーしてCloudFrontのキャッシュ削除を行います。
20250929.drawio.png

環境構築

自動化の前に、CloudFrontのディストリビューションを作成し、S3バケットをオリジンに設定しておきます。
既にCloudFrontでS3バケットをオリジンにしている構成がある場合は、このセクションはスキップしても構いません。

S3バケットの作成

  • バケットタイプ:汎用
  • バケット名:例)my-test-bucket-20250930 ※グローバルで一意の名前にする必要があります。

他は全てデフォルトのままバケットを作成をクリック。

S3バケットの静的ウェブサイトホスティングの有効化

S3バケット作成後、プロパティタブをクリックし、静的ウェブサイトホスティングセクションの編集をクリック。

  • 静的ウェブサイトホスティング:有効にする
  • インデックスドキュメント:index.html

他は全てデフォルトのまま変更の保存をクリック。

S3バケットにhtmlファイルをアップロード

下記のような簡単なhtmlファイルを作成し、S3バケットにアップロードします。
最終更新:の部分は、アップロードするたびに書きかえます。
※このhtmlファイルは生成AIに作成してもらいました。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>CloudFront キャッシュ削除テスト</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      margin: 40px;
      text-align: center;
    }
    h1 {
      color: #2c3e50;
    }
    p {
      font-size: 1.2em;
    }
    .timestamp {
      margin-top: 20px;
      font-weight: bold;
      color: #e74c3c;
    }
  </style>
</head>
<body>
  <h1>CloudFront キャッシュ削除テストページ</h1>
  <p>このページを更新してS3に再アップロードしてください。</p>
  <p>キャッシュ削除が自動で動作していれば、CloudFront経由でも最新内容がすぐ反映されます。</p>

  <!-- デプロイごとに変更する部分 -->
  <div class="timestamp">
    最終更新: 2025-09-28 23:45
  </div>
</body>
</html>

CloudFrontディストリビューションの作成

CloudFrontのコンソールに移動し、ディストリビューションを作成をクリック。

ディストリビューションの作成ページが新しいUIに最近変わったみたいです。本記事では昔のUIで説明します。
昔のUIで作成する場合は、新UI上部の「Create Distribution」をクリックしてください。

  • オリジンを選択:<作成したS3バケット名>.s3.ap-northeast-1.amazonaws.com
  • オリジンアクセス:Origin access control settings (recommended)を選択し、Create new OACをクリック。
    • OACの設定は全てデフォルトのままCreateをクリック
  • ウェブアプリケーションファイアウォール (WAF) :セキュリティ保護を有効にしないでくださいを選択
  • 料金クラス:北米、欧州、アジア、中東、アフリカを使用を選択
  • デフォルトルートオブジェクト:index.html

他は全てデフォルトのままディストリビューションを作成をクリック。

S3バケットのバケットポリシー設定

ディストリビューション作成後、Copy Policyをクリックし、バケットポリシーをコピーします。
作成したS3バケットのアクセス許可タブからバケットポリシーをコピペして変更の保存をクリック。

動作確認

作成したCloudFrontディストリビューションのドメイン名(例:d123456abcdefg.cloudfront.net)にアクセスし、S3バケットにアップロードしたhtmlファイルが表示されることを確認します。
image.png

ちなみに、CloudFrontのキャッシュが効いているか確認するために、htmlファイルの最終更新:の部分を変更してS3バケットに再アップロードし、CloudFrontのドメイン名に再度アクセスしてみてください。
変更が反映されていなければ、キャッシュが効いていることになります。

また、画像のようにCloudFrontのキャッシュ削除を手動で行い、再度アクセスしてみてください。
image.png
最終更新:の部分が変更されていれば、キャッシュ削除が正しく動作していることになります。
このキャッシュ削除を自動化していきます。

CloudFrontキャッシュ削除の自動化

長くなりましたが、ここからが本題です。
構成図でも示したように、S3バケットにファイルをアップロードした際に、Lambda関数をトリガーしてCloudFrontのキャッシュ削除を行います。

Lambda関数の作成

Lambdaのコンソールに移動し、関数の作成をクリック

  • 一から作成を選択
  • 関数名:例)s3-cloudfront-invalidation
  • ランタイム:Python 3.13
  • アーキテクチャ:x86_64

他は全てデフォルトのまま関数の作成をクリック。

Lambda関数のIAMロール設定

  • 設定タブのアクセス権限からLambda関数の実行ロールをクリックし、IAMコンソールに移動。
  • ポリシーをアタッチをクリックし、CloudFrontFullAccessを選択して許可を追加をクリック。

Lambda関数のトリガー設定

  • 設定タブのトリガーからトリガーを追加をクリック
  • ソースを選択:S3
  • バケット:作成したS3バケット名を選択
  • イベントタイプ:すべてのオブジェクト作成イベントを選択

他は全てデフォルトのまま追加をクリック。

Lambda関数のコード設定

Lambda関数のコードエディタに下記コードをコピペし、デプロイをクリック。

import boto3
import os
from datetime import datetime

client = boto3.client("cloudfront")
DISTRIBUTION_ID = os.environ["CLOUDFRONT_DISTRIBUTION_ID"]

def lambda_handler(event, context):
    client.create_invalidation(
        DistributionId=DISTRIBUTION_ID,
        InvalidationBatch={
            "Paths": {
                "Quantity": 1,
                "Items": ["/index.html"]
            },
            "CallerReference": str(datetime.now().timestamp())
        }
    )
    return {
        "statusCode": 200,
        "body": "Invalidation created"
    }

Lambda関数の環境変数設定

  • 設定タブの環境変数から編集をクリック
  • 環境変数を追加:
    • CLOUDFRONT_DISTRIBUTION_ID:作成したCloudFrontディストリビューションのIDを入力

動作確認

これにて設定は完了です!最後に動作確認をしてみましょう!
S3バケットにアップロードしたhtmlファイルの最終更新:の部分を変更して再アップロードし、CloudFrontのドメイン名にアクセスしてみてください。
すぐに変更が反映されていれば、CloudFrontのキャッシュ削除が自動で動作していることになります。

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?