こんにちは。CS課の坂本です。
サーバーワークスでは、技術ブログ執筆後のレビュー依頼を「Questetra」でおこなっています。通常は3人からOKが出ると「公開」できます。公開OKであっても、レビューしてくれた人から何かコメントが入っていることもあります。
前回書いた記事のときは、こんなコメントがありました。
------- [2016-04-18 11:58] 良かと思います。EC2じゃなくてLambda使いたいなぁ…(ボソッ)
「EC2でスクリプトをcron実行している箇所についてLambdaにしたら?」という指摘です。やっぱり時代は「Lambdaでサーバーレス」のようです。
確かにLambdaは昨年スケジュールベースでの実行が可能になりましたので、cronで実行しているスクリプトはLambdaに置き換えられそうです。
ということで、今回は前回EC2でcron実行していた箇所をLambdaに置き換えたいと思います。
※Lambdaの箇所以外は前回と同じですので、よろしければ以下の記事もご確認ください。
前回記事:【そんなときどうする?】CloudWatchのデータを2週間以上残したい!
1. 今回の処理の流れ
今回の処理の流れは以下のようになっています。処理の最初のLambdaの箇所がEC2から置き換えた箇所です。
1. Lambdaからスクリプトを実行(今回の変更箇所)
2. 本番のWebサーバー(www01)のCPUUtilizationの値をCloudWatchから取得
3. 開発アカウントのDynamoDBに入れる
2. スクリプトの準備
1. スクリプト(cloudwatch-to-dynamodb.py)
まずはスクリプトの準備をします。Lambdaは前回使っていたPHPが使えないので、Pythonでコードを書き換えます。
以下が書き換え後の今回実行するスクリプトです。
※処理内容については、前回の記事に補足説明があるので、よろしければそちらもご確認ください。
2. デプロイパッケージの準備
スクリプトの準備はできましたが、デフォルトで使えるパッケージ以外をimportしたい場合は、デプロイパッケージを手元でつくってアップロードする必要があります。
特にimportするパッケージがなく、1ファイルで完結するスクリプトであればLambdaのマネジメントコンソール上でペタッとコードを貼ることもできますが、今回は「pytz」というタイムゾーンを扱えるようにするパッケージを使っているので、準備が必要です。
※「AWS SDK for Python (Boto3)」は標準で使えますので、SDKのデフォルトのバージョンを使う場合は、パッケージに含める必要はありません。今回使う「pytz」のみデプロイパッケージに含めます。
まずは、以下のようにスクリプトを置いているディレクトリに「pytz」をインストールします。
pip install pytz -t /Users/kokeshi/cloudwatch-to-dynamodb
次にコードを置いたディレクトリで、zipに圧縮します。このzipファイルをあとでLambdaのマネジメントコンソールからアップロードします。
cd /Users/kokeshi/cloudwatch-to-dynamodb zip -r cloudwatch-to-dynamodb.zip *
これで、Lambdaにアップロードするスクリプトの準備ができました。
3. Lambdaの設定
1. Blueprint「lambda-canary」を選択
さて、だんだん記事が長くなってきましたが、次はLambdaの設定です。Lambdaで処理をスケジュールベースで実行するときの設定は、「スケジュールされたイベントでのAWS Lambdaの使用」に詳しい説明がありますので、今回は簡単にいきたいと思います。
こちらの設定もこのときのようにLambdaのBlueprintを使います。Blueprintの「lambda-canary」を選択して、次の画面にいきます。
2. スケジュールの設定
5分毎なら「rate(5 minutes)」、1時間ごとなら「rate(1 hour)」といった形で設定できます。cron形式でも設定できます。詳しい形式に関しても「スケジュールされたイベントでのAWS Lambdaの使用」に記載されていますので、使用する際はそちらもご確認ください。今回は毎時10分に実行するので、以下の画像のような形で設定します。
3. HandlerとRoleの設定
次は「Handler」の設定です。「ファイル名.関数名」の形式で指定します。「Role」は今回の場合は事前に作成済みだったRoleを指定しています。このRoleは管理ポリシーで「AmazonDynamoDBFullAccess」と「AWSLambdaBasicExecutionRole」を指定して、インラインポリシーで以下の設定をしています。記事が長くなってきたので、この辺りの詳しい説明はまた別の機会に書きたいと思います。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::XXXXXXXXXXXX:role/DevReadOnlyRole" } }
このページにある「Timeout」の設定はデフォルトで3秒と短かったので、適宜変更して次の画面へいきます。すぐにスタートする場合は「Enable event source」にチェックを入れて「Create function」ボタンを押せば完了です。
4. 結果
スクリプト実行後にマネジメントコンソールをみると、以下のようにデータが入っていることを確認できます。
5. まとめ
これでEC2でcron実行していた箇所をLambdaに変更することができました。いままで実行していたPHPのコードをPythonに変更したりと一手間必要ですが、いままでcronで実行していたスクリプトは今後Lambdaに置き換えていけそうですね。
さて、次回です。今回もスクリプトをのせたものの、前回と同様、テーマと違う箇所には触れられませんでしたので、そちらについて書きたいと思います。
いや〜、Lambdaって本当にいいものですね。
sakamoto
最新記事 by sakamoto (全て見る)
- 【そんなときどうする?】CloudWatchのデータを2週間以上残したい! Lambda編 - 2016年5月11日
- 【そんなときどうする?】CloudWatchのデータを2週間以上残したい! - 2016年4月19日
- LambdaのBlueprintを使って、CloudWatchのアラームをSlackに投稿 - 2016年2月16日
Tags: AWS Cloudwatch DynamoDB Lambda Python