LoginSignup
1
0

More than 3 years have passed since last update.

AWS S3バケット名からCloufFrontのキャッシュをクリア(CreateInvalidation)するAPIをコールする

Last updated at Posted at 2019-07-09

はじめに

以前、CloudFrontの配信元のファイル(S3)が更新されたら自動的にキャッシュをクリアする仕組みを作るという記事を作成しました。

その対応の中で「CloufFrontのキャッシュをクリア(CreateInvalidation)するAPIをコールするLambdaFunction」が必要です。

当記事では具体的な実装方法を紹介します。

実装の概要

  1. 配信元となるS3バケット名からCloudFrontのIDを取得する
  2. CloudFrontのIDをキーにしてCloufFrontのキャッシュをクリア(CreateInvalidation)する

CloudFrontのIDはAWSのマネコンから確認できるので
「配信元となるS3バケット名からCloudFrontのIDを取得する」の処理はマストではありません。
しかし、バケット名からCloufFrontのキャッシュをクリアできた方が汎用性が高くなる為、CloudFrontの一覧を取得し、バケット名からCloudFrontのIDを取得する処理も実装します。

実装

CreateInvalidation.go
    //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のキャッシュを削除するパスが指定可能である為、オブジェクト名で検索をかけて対象のオブジェクトだけキャッシュクリアする方法もありますね。
追加のオブジェクトはキャッシュクリアの必要はない為、更新されたオブジェクトだけクリアしてあげてもいいですね。

1
0
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
1
0