ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【SAM】AWS SAM の Events で Lambda の定期実行を書いてみた

この記事を共有する

目次

はじめに

最近 AWS Serverless Application Model(以下、SAM)を積極的に使っています。
中でも Events が便利だったので紹介します。
AWS Lambda(以下、Lambda)の定期実行を AWS CloudFormation(以下、CloudFormation)で書くと、関数のほかに書くものが増えて手が止まりがちですが、そこが短くなります。

CloudFormation で書く場合

定期実行の書き方は 2 通りあります。
どちらを選んでも、スケジュールの定義だけでは動きません

EventBridge ルールを使う場合

Amazon EventBridge のルールでスケジュールを定義し、ターゲットに Lambda 関数を指定します。

ExampleScheduleRule:
  Type: AWS::Events::Rule
  Properties:
    ScheduleExpression: 'cron(0 * * * ? *)'
    State: ENABLED
    Targets:
      - Arn: !GetAtt ExampleFunction.Arn
        Id: ExampleTarget

これだけでは EventBridge が Lambda を呼べないため、呼び出しを許可するリソースを追加します。

ExampleSchedulePermission:
  Type: AWS::Lambda::Permission
  Properties:
    FunctionName: !Ref ExampleFunction
    Action: lambda:InvokeFunction
    Principal: events.amazonaws.com
    SourceArn: !GetAtt ExampleScheduleRule.Arn

EventBridge Scheduler を使う場合

EventBridge Scheduler の場合は、ターゲットを呼び出すための IAM ロールを渡す形になります。

ExampleSchedule:
  Type: AWS::Scheduler::Schedule
  Properties:
    ScheduleExpression: 'cron(0 * * * ? *)'
    ScheduleExpressionTimezone: 'Asia/Tokyo'
    FlexibleTimeWindow:
      Mode: 'OFF'
    Target:
      Arn: !GetAtt ExampleFunction.Arn
      RoleArn: !GetAtt ExampleScheduleRole.Arn

この ExampleScheduleRole も自分で定義します。
信頼ポリシーに scheduler.amazonaws.com を書き、権限ポリシーに lambda:InvokeFunction を書く、という定型のロールです。
プロパティの一覧は AWS::Scheduler::Schedule にあります。

つまりどちらの方式でも、スケジュールの定義呼び出しを許可するものの 2 点セットが必要になります。
後者は毎回ほぼ同じ内容なのに、書き忘れるとデプロイは成功して実行だけが失敗するため、気づくのが遅れます。

SAM の Events で書く場合

SAM では、関数のプロパティに Events を書くだけで済みます。

ExampleFunction:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: src/example/
    Handler: app.lambda_handler
    Events:
      ExampleSchedule:
        Type: ScheduleV2
        Properties:
          ScheduleExpression: 'cron(0 * * * ? *)'
          ScheduleExpressionTimezone: 'Asia/Tokyo'
          State: ENABLED

呼び出しを許可するリソースは書いていません。
記述量は CloudFormation のおよそ 3 分の 1 になりました。
指定できるプロパティは ScheduleV2 にまとまっています。

なお、cron ベースの定期実行には ScheduleV2(EventBridge Scheduler)と Schedule(EventBridge ルール)の 2 つが選べます。
ScheduleV2 は ScheduleExpressionTimezone に Asia/Tokyo を指定できるので、cron 式をそのまま日本時間として読めます。
Schedule は協定世界時(UTC)固定で、cron 式を見るたびに頭の中で 9 時間足すことになります。
読みやすさの点で、私は ScheduleV2 を選んでいます。

生成されたリソースを確認する

ここで気をつけたいのは、書かなくてよくなったのではなく、SAM が代わりに書いているという点です。
デプロイ後にマネジメントコンソールを見ると、テンプレートに書いていないリソースが作られていることがわかります。

sam-events-role.png

スケジュール本体と一緒に、それがターゲットを呼び出すための IAM ロールも生成されています。 生成物の存在を知らないと「SAM が勝手に動かしている」で終わってしまいますが、実体が IAM ロールだと分かっていれば、そのロールの権限を見にいけます。

まとめ

SAM の Events で Lambda の定期実行を書いてみました。
短く書けるのが分かりやすい利点ですが、それ以上に、裏で何が作られているかを一度見ておく価値があると感じました。

この記事は私が書きました

野間 太一

記事一覧

猫とCloudFormationが好きです。

野間 太一

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。