🌟
GolangでCloudFrontのキャッシュを削除する
S3の画像をCloudFrontで流しているのですが、画像更新時にはキャッシュ(エッジサーバー上のキャッシュ)をクリアしたいなと思い、やり方を調べました。
Goで実装する
Golangで実装するには、AWS SDK GoのCloudFront周りの機能を使います。
公式はこちら: cloudfront - Amazon Web Services - Go SDK
このSDKの CreateInvalidation
というメソッドを使います。
実装としては以下の感じです。
const (
// CloudFrontのID
CloudFrontID = "HOGEHOGE"
//cloudfrontでキャッシュ削除するパス
ClearTargetPath := "/*"
)
func ClearCache() error {
svc := cloudfront.New(session.New())
jstNow := time.Now().UTC().In(time.FixedZone("Asia/Tokyo", 9*60*60))
callerReference := jstNow.Format("200601021504")
_, err := svc.CreateInvalidation(createInvalidationInput(callerReference))
if err != nil {
return err
}
return nil
}
func createInvalidationInput(callerReference string) *cloudfront.CreateInvalidationInput {
pathItems := []*string{&ClearTargetPath}
return &cloudfront.CreateInvalidationInput{
DistributionId: aws.String(CloudFrontID),
InvalidationBatch: &cloudfront.InvalidationBatch{
CallerReference: &callerReference,
Paths: &cloudfront.Paths{
Quantity: aws.Int64(1),
Items: pathItems,
},
},
}
}
CallerReference
というのはユニークな値であればいいらしいので、タイムスタンプを入れています。
CreateInvalidationInput
で削除対象のDistributionIdやパスを指定します。
Lambdaで実行する場合には、CloudFrontの権限付与をお忘れなく。
余談(AWS webコンソールからの削除方法)
CloudFrontのエッジサーバー上のキャッシュ自体はAWSのwebコンソールからでも消せるようです。
[AWS] Amazon CloudFrontのキャッシュ削除(Invalidation)にあるように、 Invalidation
というのがキャッシュ削除にあたる用語だそうです。
Discussion