1
/
5

AWS Lambdaを使用し、CloudfrontのInvalidationを走らせる

こんにちは。エンジニアの志村です。
先日assets on S3についての実装を行いました。  

その記事は下記になります。

assets on S3の導入 - Cluex Developersブログ
こんにちは。エンジニアの志村です。 最近暑くて参りますね...。アイスばっかり食べてます。 さて今回ですが、Assets on S3を導入しましたのでその際のメモです。 結構この形でassetsを配信しているサービスは多いですよね。 今回は、Cloudfront+S3 / asset_sync+ capistrano という定番のパターンで実装しております。 デプロイ時にassetsファイルをS3に配置し、CDN経由で配信する方法です。 通常であればnginxや Apache等のWebサーバーを介して静的
http://cluex-developers.hateblo.jp/entry/2016/08/10/183055

今回はasset_syncにより、S3にassetファイルがアップロードされた段階でCloudfrontのInvalidationをLambdaを使用して走らせるという処理を実装したいと思います。

Invalidationとは

Cloudfrontのキャッシュを明示的に消す機能です。

AWS CloudFrontのinvalidationにワイルドカードが使えるようになりました。 | Developers.IO
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。 こんにちは、せーのです。今日はCloudFrontを使っている方にちょっと便利になったアップデートをご紹介します。 ...
http://dev.classmethod.jp/cloud/aws/cloudfront-is-able-to-use-wildcard-on-invalidation

クラスメソッドさんの上記の記事が非常に分かりやすいかと思います。

キャッシュを使用するのに重要なポイントは適切なキャッシュ期間を設けることです。それを行わないと古いファイルがいつまで経っても配信され続けてしまいます。
特に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を作成します


コードは下記のコードが非常に分かりやすかったのでそれを使用します。

How to Automatically Invalidate Dynamic Objects in Amazon CloudFront Using AWS Lambda
If uses Amazon CloudFront for content delivery, webmaster can set up time frames, in which object in its exact state will be available for users. When this Time-To-Live (TTL) frame elapses, the network consults the origin server and replaces cached copy w
http://www.cloudberrylab.com/blog/how-to-automatically-invalidate-dynamic-objects-in-amazon-cloudfront-using-aws-lambda

※DistributionIDは自身のCloudfrontディストリビューションのIDを入力して下さい

因みにですが、boto3はPython用のAWS SDKです。
Lambda FunctionをPythonで書く際には必ずと言って良いほど良く使用します。
ドキュメントも充実しているので非常に使い勝手が良いと思います。

Boto 3 Documentation - Boto 3 Docs 1.4.1 documentation
Boto is the Amazon Web Services (AWS) SDK for Python, which allows Python developers to write software that makes use of Amazon services like S3 and EC2. Boto provides an easy to use, object-oriented API as well as low-level direct service access.
http://boto3.readthedocs.io


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が使いやすくなりますね。

株式会社クルイト's job postings
6 Likes
6 Likes

S3

Weekly ranking

Show other rankings