AWSのLambdaでcronみたいな感じで定期実行する

[最終更新] 2020年4月21日

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)

以上。

関連コンテンツ

関連記事

スポンサーリンク

カテゴリーaws

コメントを残す

メールアドレスが公開されることはありません。