こんにちは、TKです。
今回はS3で静的コンテンツのwebサイトを配信している際に、定時更新を行いたい場合の構築についてご紹介したいと思います。
更新の手段
配信コンテンツを置いているバケットは置かれているものを基本アクセス許可してしまいます。
アクセス権限を変更する事で配信を制御することも可能ですが、今回はLambdaのCloudWatch Events Scheduleを使用して、定時に対象バケットにオブジェクトを移動させる方法をご紹介します。
予約配信システムの構築
静的コンテンツ配信についてはこちらの記事を参考にしてください
http://recipe.kc-cloud.jp/archives/4618
http://recipe.kc-cloud.jp/archives/458
今回はcloudfrontを使う配信方法を取っています。
まず、配信用バケットと別に更新コンテンツ用バケットを作成します。
次に、S3のバケットコピーコマンドですがCLIだとこのようになります。
1 |
aws s3 sync s3://contnts-up/ s3://contents-watch/ |
このコマンドを定期実行するために専用サーバを立ち上げるのは本末転倒なのでLambdaで実装します。
AWS cli をLambdaで動かす方法はこちらを参考にいたしました。
http://www.magtranetwork.com/aws/aws_lambda_python_aws_cli.html
実際に今回のコマンドを組み込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import commands import json import os from cStringIO import StringIO import re print('Loading function') def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print(_("./aws s3 sync s3://contents-up/ s3://contents-watch/")) |
IAM roleは「S3Fullaccess」のポリシーをつけたlambda roleを使用します。
実行の際モジュールの読み込みに時間がかかるので「Time out」の値は30secに指定します。
次に定期更新時刻の設定を行います。
「Event sources」から「Add event source」を選択します。
「CloudWatch Events – Schedule」を選択します。
「Rule name」に識別名を指定します。
「Rule description」には動作の説明を記入します。
「Schedule expression」にはLambda fanctionの実行タイミングを指定することができます。
rate()であれば括弧内の間隔で実行、cronであれば指定したタイミングでの実行が可能です。
詳しい設定方法はこちらを参考にしてください。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-scheduled-events.html
設定完了後、実際に動作するか確認してみました。
URLからでも確認することができました。
いかがでしたでしょうか。
今回はLambdaでCloudWatch Events Scheduleについて説明しました。
CloudWatch Events Scheduleの使い方についてお役に立てば幸いです。
次回をお楽しみに!