生涯未熟

生涯未熟

プログラミングをちょこちょこと。

S3にファイルがアップロードされた時にCloudFrontのキャッシュを削除してみる

掲題の通りのことが社で必要になったので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の中の人には頑張って追加して欲しいところ・・・🙏