こんにちは。エンジニアの志村です。 先日assets on S3についての実装を行いました。
その記事は下記になります。
今回はasset_syncにより、S3にassetファイルがアップロードされた段階でCloudfrontのInvalidationをLambdaを使用して走らせるという処理を実装したいと思います。
Invalidationとは Cloudfrontのキャッシュを明示的に消す機能です。
クラスメソッドさんの上記の記事が非常に分かりやすいかと思います。
キャッシュを使用するのに重要なポイントは適切なキャッシュ期間を設けることです。それを行わないと古いファイルがいつまで経っても配信され続けてしまいます。 特にassets on S3を使用する場合には、明示的にファイルをInvalidationしないといつまで経っても最新のassetsファイルがユーザーに配信されなくなります。 このような状況を防ぐために、S3にファイルが転送された段階で、assetsのキャッシュを消去する必要があります。
Lambdaの実装 ではLambdaの実装を始めていきます。
1. AWSコンソールからLambdaを選択します
2.「Create Lambda Function」を選択します
3. 今回はBlueprintは使用しないので「Skip」を選択します
4. S3を選択します。
※Prefix, Suffixは必要であれば入力して下さい。
5. Lambda Functionを作成します
コードは下記のコードが非常に分かりやすかったのでそれを使用します。
※DistributionIDは自身のCloudfrontディストリビューションのIDを入力して下さい
因みにですが、boto3はPython用のAWS SDKです。 Lambda FunctionをPythonで書く際には必ずと言って良いほど良く使用します。 ドキュメントも充実しているので非常に使い勝手が良いと思います。
6. ロールやその他の設定をします
「Lambda function handler and role」のRole→「Create a custom role」を選択します。
そうすると下記のような画面が現れるので、下記のCloudfrontのInvalidationを許可するロールを作成します。
下記のようなポリシードキュメントになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"cloudfront:CreateInvalidation"
],
"Resource": [
"*"
]
}
]
}
7. 最後に「Create function」を押下すれば完成です!
使い方 asset_syncでデプロイすると勝手にInvalidationが走ってくれます。 下記の画面で確認が出来ます。
1. AWSコンソールからCloudfrontを選択します
2. 該当するディストリビューションのIDを選択します
3.「Invalidations」タブを選択すると、Invalidationsの状態が閲覧出来ます。ここでデプロイ直後にStatusがProgressとなっていればトリガーがきちんと走っています。
以上になります。
キャッシュの扱いって本当難しいなーと感じますが、この様に自動化してしまえば特に意識することも少なくなって、よりCloudfrontが使いやすくなりますね。