AWSのLambda関数を、Linuxのcronのような感じで定期的に実行したい時のやり方のメモ。
トリガーをCloudWatch Eventsのスケジュール式にすればよい。5分毎、のような設定が可能なRate式と、従来のcronとほぼ同じように毎月2時15分00秒、というような設定が可能なCron式の設定がある。
Webコンソールのやり方と、ついでにSAM使うときのtemplate.yamlの例。
やりたいこと
Lambda関数を定期的に実行したい。
やり方
Lambda関数のトリガーを、CloudWatch Eventsにして、ルールタイプをスケジュール式にする。
スケジュール式には、5分毎とか1時間毎といったような設定が可能なRate式と、毎月2時15分00秒というように日時を細かく指定できるCron式がある。
Rate式のほうが簡単に設定できる。日時指定が必要なければRate式が楽。
# Rate式
# 5分ごと
rate(5 minutes)
# 1時間ごと
rate(1 hour)
日時指定が必要な時は、やはりCron式。書式は
cron(分 時 日 月 曜日 年)
で、なんとYearがある。また、タイムゾーンはUTCなので、日本時間から-9時間して考える。たとえば日本時間の10時はUTCでは1時。また、日と曜日のどちらかは「?」でなければいけない。
ワイルドカードも色々あるので、公式のドキュメント「Rate または Cron を使用したスケジュール式 - AWS Lambda」を見る。
公式の例。
# 毎日、UTCで10時(日本時間19時)
cron(0 10 * * ? *)
# 月曜~金曜の10分ごと
cron(0/10 * ? * MON-FRI *)
年の設定ってすごい。。
SAM使う時のtemplate.yaml
SAM使う時はtemplate.yamlを使うわけだが、「serverless-application-model/2016-10-31.md at master · awslabs/serverless-application-model」や「CloudWatch イベント アプリケーションの AWS SAM テンプレート - AWS Lambda」あたりを参考に。
ハンドラが hello_world/app.py にあるとして。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
agri-shintotsukawa-filter
Sample SAM Template for agri-shintotsukawa-filter
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Resources:
PollingFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Events:
HelloWorld:
Type: Schedule # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Schedule: rate(1 minute)
以上。
コメント