はじめに
以前、CloudFrontの配信元のファイル(S3)が更新されたら自動的にキャッシュをクリアする仕組みを作るという記事を作成しました。
その対応の中で「CloufFrontのキャッシュをクリア(CreateInvalidation)するAPIをコールするLambdaFunction」が必要です。
当記事では具体的な実装方法を紹介します。
実装の概要
- 配信元となるS3バケット名からCloudFrontのIDを取得する
- CloudFrontのIDをキーにしてCloufFrontのキャッシュをクリア(CreateInvalidation)する
CloudFrontのIDはAWSのマネコンから確認できるので
「配信元となるS3バケット名からCloudFrontのIDを取得する」の処理はマストではありません。
しかし、バケット名からCloufFrontのキャッシュをクリアできた方が汎用性が高くなる為、CloudFrontの一覧を取得し、バケット名からCloudFrontのIDを取得する処理も実装します。
実装
//cloudfrontのクライアントを作成
svc := cloudfront.New(session.New())
//cloudfrontの一覧の情報を取得する為のインプットを作成
ListDistributionsInput := &cloudfront.ListDistributionsInput{}
//cloudfrontの一覧の情報を取得
ListDistributions, _ := svc.ListDistributions(ListDistributionsInput)
S3Domain := "s3.amazonaws.com"
S3Buket := "cloudfrontの配信元のバケット名" + "." + S3Domain
for _, DLItems := range ListDistributions.DistributionList.Items {
for _, OriginsItems := range DLItems.Origins.Items {
//cloudfrontの一覧からcloudfrontの配信元のバケット名の一致を判定
if S3Buket == *OriginsItems.DomainName {
//キャッシュ削除(CreateInvalidation)コール用のIDを取得
callerReference := time.Now().Format("200601021504")
//cloudfrontのキャッシュを削除するパスを指定
Path := "/*"
PathItems := []*string{&Path}
//キャッシュ削除用(CreateInvalidation)のクライアントを作成
CreateInvalidationInput := &cloudfront.CreateInvalidationInput{
DistributionId: aws.String(*DLItems.Id),
InvalidationBatch: &cloudfront.InvalidationBatch{
CallerReference: &callerReference,
Paths: &cloudfront.Paths{
Quantity: aws.Int64(1),
Items: PathItems,
},
},
}
//キャッシュ削除(CreateInvalidation)を実行
result, _ := svc.CreateInvalidation(CreateInvalidationInput)
}
}
}
終わりに
目的のバケット名がcloudfront一覧の奥の方の構造体に入り込んでいた為、
取得するのに2重にループする必要があり、思ったより面倒でした。
改良の余地としては、cloudfrontのキャッシュを削除するパスが指定可能である為、オブジェクト名で検索をかけて対象のオブジェクトだけキャッシュクリアする方法もありますね。
追加のオブジェクトはキャッシュクリアの必要はない為、更新されたオブジェクトだけクリアしてあげてもいいですね。