目次
ごあいさつ
こんばんは。冷房とずぶずぶの関係なもに倉です。
今回は、CloudFrontのキャッシュ削除を自動化する方法を書いていこうと思います。
なぜキャッシュ削除をするのか
「あれ……、サイト更新したのに内容が反映されていないな」なんてことは、
CloudFrontを使ったことのある人なら一度は経験したことがあるのではないでしょうか。
私も、CloudFrontを使用してサーバレスなサイトを作った経験があるので、
「あれ? 更新したのにな……」となったことがあったりなかったりします。
※サーバレスなサイトの作り方はこちらからどうぞ!
そんなときは、キャッシュ削除をすれば一発です!
キャッシュ削除の方法
詳しくはCloudFront でキャッシュのクリアに記載されていますので、こちらも併せてご覧ください。
簡単に手順を載せておきます↓
手順
対象のCloudFrontのコンパネから、「キャッシュ削除」を選択します。
「キャッシュ削除を作成」を選択します。
キャッシュを消したいオブジェクトパスを入力し、「キャッシュ削除を作成」をクリックします。
画像のように「/*」と入力するとすべての領域のキャッシュが削除されます。
ステータスが「完了済み」になればOK!
これでキャッシュが削除され、更新した内容が反映されます。
解決!
本題
さて、これを毎回行うのは面倒です。更新したことに満足して、キャッシュ削除を忘れてしまいそうだし……。
というわけで、今回は「オリジンのS3が更新されたら自動的にキャッシュが削除される」
lambdaを作成していきます。
lambda作成
使ったもの
lambda(Python 3.9)
トリガーを設定
まずはlambdaが走るトリガーを設定していきましょう。
「トリガーを追加」をクリック。
トリガーにS3を選択し、BucketはCloudFrontのオリジンにしているものを設定します。
Event typeは「All object create events」を設定。
これで「S3の内容が更新されたとき」とイコールの、はず!(英語ができないもに倉)
他の設定はデフォルトでOKです。
アクセス権限を付与
続いて、このlambdaがCloudFrontにアクセスできるように設定していきます。
これを設定しておかないとlambdaが困っちゃうので忘れないように設定しましょう。
設定タブの「アクセス権限」から、実行ロールのリンクをクリックします。
IAMロールの画面に飛ばされるので、「許可を追加」から「ポリシーをアタッチ」をクリック
「CloudFront」で検索をかけて、「CloudFrontFullAccess」を選択しポリシーをアタッチします。
コード
こんなかんじで↓
from __future__ import print_function
import boto3
import time
def lambda_handler(event, context):
client = boto3.client('cloudfront')
invalidation = client.create_invalidation(DistributionId='【対象のディストリビューションID】',
InvalidationBatch={
'Paths': {
'Quantity': 1,
'Items': ['/*']
},
'CallerReference': str(time.time())
})
これでデプロイすれば完成です!
あとがき
地味に便利です。
些細なことでも自動化すると楽でいいですね。
たまごのひび割れから身が見え始めたエンジニア。