🌟

GolangでCloudFrontのキャッシュを削除する

2020/10/15に公開

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