技術ブログ - 毎日が成長!

【そんなときどうする?】CloudWatchのデータを2週間以上残したい! Lambda編

このエントリーをはてなブックマークに追加
2016年05月11日(水) 投稿者 sakamoto

 こんにちは。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. 今回の処理の流れ
  2. スクリプトの準備
  3. Lambdaの設定
  4. 結果
  5. まとめ

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って本当にいいものですね。

 

Tags:

記事トップへ
エンジニア/プログラマ職チャレンジ採用

PAGE TOP