Featured image of post AWS LambdaをCloudWatch EventsでCron実行する方法【サーバーレス】

AWS LambdaをCloudWatch EventsでCron実行する方法【サーバーレス】

AWS LambdaとCloudWatch Eventsを組み合わせて、Cron指定でLambda関数を定期実行する方法。サーバーレスでバッチ処理が実現できます。トリガーの作成からCloudWatch Logsでの実行確認まで手順つき♪

1282文字

Lambda関数を定期実行しよう

サーバーレスを実現出来るLambda関数

先日まで、AWS Lambdaに関する記事をご紹介しました。

関連記事 【サーバーレスアークテクチャ開発】ローカル環境でAWSのLambdaスクリプトをPythonで実装する際に「python-lambda-local」で動作確認する際のインストール方法とやり方【Bot開発にオススメ】 2019/01/01 3710文字 約8分で読めます IT AWS Mac Python Windows 関連記事 【Python3】コマンドラインから簡単にAWS lambdaに関数をアップロード出来ちゃう「lambda-uploader」のインストール方法と使い方【手順まとめ】 2019/01/16 2780文字 約6分で読めます IT AWS Mac Python Windows

Lambda関数を使えば、サーバーを用意せずにAWSサービスをトリガーに処理を実装出来るので今注目されている技術です。

Cronによる定期実行も可能

そして、もう一つの強みが何と言ってもCron指定により定期実行をスケジューリング出来ることです!

これを知った時、サーバーを用意せずに実現出来ることが素晴らしすぎて感動しました。

また、設定自体もとても簡単に行うことが出来たので、今回は手順をご紹介致します。

手順

前提

サンプルとしては以下の記事で作成したLambda関数を利用します。

関連記事 【Python3】コマンドラインから簡単にAWS lambdaに関数をアップロード出来ちゃう「lambda-uploader」のインストール方法と使い方【手順まとめ】 2019/01/16 2780文字 約6分で読めます IT AWS Mac Python Windows

しかし、定期実行の場合はeventを取得出来ない為、CloudWatch Logsに以下のようなエラーログが出てしまいます。

実行ログ
START RequestId: 043f221c-84c9-452a-a8a5-4c6a7c4d1171 Version: $LATEST
'url': KeyError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 4, in lambda_handler
response = requests.get(event['url'])
KeyError: 'url'

END RequestId: 043f221c-84c9-452a-a8a5-4c6a7c4d1171
REPORT RequestId: 043f221c-84c9-452a-a8a5-4c6a7c4d1171	Duration: 1.51 ms	Billed Duration: 100 ms Memory Size: 128 MB	Max Memory Used: 32 MB

ですので、lambda_function.pyを以下のように修正しておきましょう。

lambda_function.py
import requests

def lambda_handler(event, context):
    response = requests.get('')
    return 'Status : %d' % response.status_code

トリガーの作成

まずはLambda関数の設定画面を開き、設定タブを選択した状態でDesignerCloudWatch Eventsを選択します。

すると、下部エリアがトリガーの設定画面になるので新規のルール作成を選択し、ルール名・ルールの説明を入力したら、ルールタイプスケジュール式にチェックを入れ、スケジュール式にcron形式を入寮します。

今回は試しに1分ごとに起動したいのでcron(0/1 * * * ? *)と入力しましょう。

そして、トリガーの有効化にチェックを入れたら追加ボタンをクリックしましょう。

CloudWatch Eventsがセットされていることを確認して保存ボタンをクリックします。

正常に保存されたらスケジュールに則ってLambda関数が実行されるはずです。

確認

では、CloudWatch Logsを覗いてみましょう。

CloudWatch Logs
10:24:16
START RequestId: fb9f45e6-19e9-43a4-98bd-60dc4a6bacd6 Version: $LATEST
START RequestId: fb9f45e6-19e9-43a4-98bd-60dc4a6bacd6 Version: $LATEST
10:24:16
END RequestId: fb9f45e6-19e9-43a4-98bd-60dc4a6bacd6
END RequestId: fb9f45e6-19e9-43a4-98bd-60dc4a6bacd6
10:24:16
REPORT RequestId: fb9f45e6-19e9-43a4-98bd-60dc4a6bacd6	Duration: 257.63 ms	Billed Duration: 300 ms Memory Size: 128 MB	Max Memory Used: 32 MB
REPORT RequestId: fb9f45e6-19e9-43a4-98bd-60dc4a6bacd6	Duration: 257.63 ms	Billed Duration: 300 ms Memory Size: 128 MB	Max Memory Used: 32 MB
10:25:16
START RequestId: f7a91c50-8ea0-4780-ab21-ca398443de1c Version: $LATEST
START RequestId: f7a91c50-8ea0-4780-ab21-ca398443de1c Version: $LATEST
10:25:17
END RequestId: f7a91c50-8ea0-4780-ab21-ca398443de1c
END RequestId: f7a91c50-8ea0-4780-ab21-ca398443de1c
10:25:17
REPORT RequestId: f7a91c50-8ea0-4780-ab21-ca398443de1c	Duration: 272.58 ms	Billed Duration: 300 ms Memory Size: 128 MB	Max Memory Used: 32 MB
REPORT RequestId: f7a91c50-8ea0-4780-ab21-ca398443de1c	Duration: 272.58 ms	Billed Duration: 300 ms Memory Size: 128 MB	Max Memory Used: 32 MB

正しく1分ごとに実行されていますね♪

終わりに

以上のようにサーバーレスで定期実行処理を実装することが出来ました。

この機能を組み合わせて使うことで、バッチ処理なども行う事が出来るので興味のある方は試してみてください♪