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

デプロイ後にCloudFrontのキャッシュ削除をLambda関数で自動化する

Posted at

はじめに

S3+CloudFrontでホスティングされているプロジェクトでCodePipelineでS3へのデプロイ後にCloudFrontのキャッシュを自動で削除するLambda関数を作成しました。

備忘録として残します。あくまでも簡易的な実装例の1つとして参照してください。

概要

HTML/CSS/JavaScriptで構成されている静的サイト。
S3でホスティングしCloudFrontから配信している。
CI/CDがCodePipelineで自動化されている。
CloudFrontのキャッシュの削除を手動でマネジメントコンソールから行っていた。

実装

1. キャッシュ削除を行うLambda関数を実装

今回、Lambda関数はPythonで実装する。

import boto3
import time
import os

# Lambdaのエントリーポイント
# HP本番環境のCloudFrontディストリビューションに対してキャッシュ削除を行う
def lambda_handler(event, context):
    client = boto3.client('cloudfront')
    pipeline = boto3.client('codepipeline')
    try:
        # HP本番環境のディストリビューションIDを指定してキャッシュ削除を実行
        invalidation = client.create_invalidation(DistributionId='【ここにCloudFrontのディストリビューションIDを記載】',
            InvalidationBatch={
                'Paths': {
                    'Quantity': 1,
                    'Items': ['/*']
            },
            # CallerReferenceは一意になるように設定する必要があるため、現在時刻を設定
            'CallerReference': str(time.time())
        })

         # CodePipeline ジョブIDを取得
        job_id = event['CodePipeline.job']['id']

        # CodePipeline に成功レスポンスを送信
        pipeline.put_job_success_result(jobId=job_id)

    except Exception as e:
        # CodePipelineのジョブIDを指定して失敗を通知
        pipeline.put_job_failure_result(
            jobId=job_id,
            failureDetails={
                "type": "JobFailed",
                "message": str(e),
            },
        )

要点を説明すると、

  • CodePipelineから呼び出されることを前提にキャッシュを全削除する。
  • キャッシュ削除をする際にCallerReferenceが一意である必要があるので現在時刻を設定
  • CodePipelineのジョブIDを取得してキャッシュ削除が完了したことをCodePipelineへ通知する

2. Lambda関数用のIAMポリシーを編集

Lambda関数に関連付けしているIAMロールにアタッチされているIAMポリシーに必要な権限を追加する。
CodePipelineへ実行結果を通知するために

  • “codepipeline:PutJobFailureResult"
  • "codepipeline:PutJobSuccessResult"

Lambda関数がCloudFrontのキャッシュを削除するために

  • "cloudfront:CreateInvalidation”
    の権限を許可する。

3. CodePipelineを編集

S3へのデプロイが完了した後に新しくステージを追加し、アクションプロバイダーをAWS Lambdaに設定する。
2.で実装したLambda関数を呼び出す。

4. 動作確認

デプロイを実行し、CloudFrontの対象のディストリビューションのキャッシュ削除の履歴を確認し、実行されていることを確認する。

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