掲題の通りのことが社で必要になったのでGoでやってみました。
やりたいこと
S3に置いた静的HTMLをCloudFrontを通してアクセスする、という形で配信しているシステムがあり、運用する中で静的HTMLを置き換えた時にすぐに切り替わるようにしたいということで、CloudFrontのキャッシュを都度削除する必要がありました。
ただし、毎日切り替わる代物なのでその都度手動でCloudFrontの特定Bucketに対してInvalideするのは面倒だなーと思ったので、それならファイルを置いた時に自動的にInvalidateが実行されるようにしたいというのが目的です。
どうやるか
さて、やり方ですが今回はLambdaを使って実現しました。
Lambdaのイベント発火条件として「S3のObjectCreatedByPut」を使います。
これでS3の指定したBucketにObjectが生成・更新された際にLambdaの関数が動いてくれます。
そして、以下のようなLambda関数を作成します。
簡単に説明すると、発火したイベント詳細を引数として受け、そこからバケット名を取得してCloudFrontのDistoributionのドメイン名と合致するものを探します。
見つかれば、そのDistributionに向かって CreateInvalidation
関数を使ってinvalidationを実行するだけです。非常に簡単ですね。
こんなにも簡単に作成出来てしまうのだからLambdaの力は凄いですね。
贅沢を言うとGoの設計テンプレートが全く無いので、AWSの中の人には頑張って追加して欲しいところ・・・🙏