EventBridge(CloudWatch Events)のスケジュール式で、Lambda関数を定期的に実行する

目次

Lambda関数を定期的に実行する

EventBridgeを使用することで、定期的なアクションを設定することができます。

今回はLambda関数を定期的に実行します。

構築する環境

Diagram of schedule expressions in EventBridge (CloudWatch Events) to execute Lambda functions periodically.

Lambda関数を作成します。
関数を定期的に実行するために、EventBridgeのスケジュール式を設定します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-soa/tree/main/03/003

テンプレートファイルのポイント解説

Lambda関数

Resources:
  Function1:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        ZipFile: |
          import datetime

          def lambda_handler(event, context):
            now = datetime.datetime.now()
            now_str = now.strftime('%Y-%m-%d %H:%M:%S')
            print(now_str)
      FunctionName: !Sub "${Prefix}-function1"
      Handler: !Ref Handler
      Role: !GetAtt FunctionRole.Arn
      Runtime: !Ref Runtime
Code language: YAML (yaml)

EventBridgeのスケジュール式の検証用として、シンプルなLambda関数を作成します。
今回はインラインで実行するコードを記載します。

CloudFormationでLambda関数を作成する方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationでLambdaを作成する3パータン(S3/インライン/コンテナ) 【CloudFormationでLambdaを作成する】 CloudFormationでLambdaを作成する場合、大別すると以下の3パターンあります。 S3バケットにコードをアップロードする インライ...

コードの内容ですが、現在日時を取得し、出力するものとなります。

同様の関数をもう1つ用意します。

EventBridge

ルール

Resources:
  Rule1:
    Type: AWS::Events::Rule
    Properties:
      Name: !Sub "${Prefix}-EventsRule1"
      ScheduleExpression: rate(1 minute)
      State: ENABLED
      Targets:
        - Arn: !Ref FunctionArn1
          Id: !Ref Function1

  Rule2:
    Type: AWS::Events::Rule
    Properties:
      Name: !Sub "${Prefix}-EventsRule2"
      ScheduleExpression: cron(* * * * ? *)
      State: ENABLED
      Targets:
        - Arn: !Ref FunctionArn2
          Id: !Ref Function2
Code language: YAML (yaml)

ScheduleExpressionプロパティで、いつLambda関数を実行するかを指定します。
今回は1分ごとに関数を実行するように設定します。

記法は2種類あります。
1つ目はrate式です。
詳細な記述方法については、以下のページをご確認ください。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html#RateExpressions

2つ目はcron式です。
詳細な記述方法については、以下のページをご確認ください。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions

Targetsプロパティで実行する対象リソース指定します。
今回はLambda関数が対象ですから、これらのARNを指定します。

リソースベースポリシー

EventsRulePermission1:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref Function1
      Action: lambda:InvokeFunction
      Principal: events.amazonaws.com
      SourceArn: !GetAtt Rule1.Arn
Code language: YAML (yaml)

EventBridgeのスケジュール式を使用してLambda関数を定期実行する場合、EventBridgeがLambda関数を実行するという形になります。
ですから関数を実行するために必要な権限を、EventBridgeルールに与える必要があります。
リソースベースポリシーを作成し、EventBridgeルールがLambda関数を実行する権限(lambda:InvokeFunction)を与えます。

なおEventBridgeに権限を与える方法を大別すると、リソースベースポリシーを作成する方法と、IAMロールを作成してルールに関連付ける方法がありますが、今回は前者を選択しました。
これはEventBridgeおよびLambda関数の以下の仕様によるものです。

Lambda、Amazon SNS、Amazon SQS、および Amazon CloudWatch Logs リソースの場合、EventBridge はリソースベースのポリシーを使用します。

Amazon EventBridge のリソースベースのポリシーを使用する

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • Lambda関数1:soa-03-003-function1
  • Lambda関数2:soa-03-003-function2
  • EventBridgeルール1:soa-03-003-EventsRule1
  • EventBridgeルール2:soa-03-003-EventsRule2

AWS Management ConsoleからもSSMの状況を確認します。
EventBridgeルールを確認します。

まず1つ目のルールから確認します。

Detail of EventBridge 1.
Detail of EventBridge 2.

rate式でスケジュールが設定されていることがわかります。
対象のリソースを見ると、1つ目のLambda関数が指定されていることもわかります。

次に2つ目のルールを確認します。

Detail of EventBridge 3.
Detail of EventBridge 4.

cron式でスケジュールが設定されていることがわかります。
そして2つ目のLambda関数がターゲットとして指定されていることもわかります。

動作確認

準備が整いましのたので、2つの関数の実行ログを確認します。

まずrate式でスケジュールした1つ目の関数のログを確認します。

Detail of Lambda 1.

1分おきに日時データが書き込まれていることがわかります。
確かにrate式によって、1分ごとにLambda関数が実行されてことがわかります。

次にcron式でスケジュールした2つ目の関数のログを確認します。

Detail of Lambda 2.

こちらも1分おきに日時データが書き込まれていることがわかります。
確かにcron式によっても、1分ごとにLambda関数が実行されてことがわかります。

まとめ

EventBridgeのスケジュール式(rate式/cron式)使用することで、Lambda関数を定期的に実行する方法を確認しました。

目次