SOA

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

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

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

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

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

構築する環境

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

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

CloudFormationテンプレートファイル

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

awstut-soa/03/003 at main · awstut-an-r/awstut-soa
Contribute to awstut-an-r/awstut-soa development by creating an account on GitHub.

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

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関数を作成する方法については、以下のページをご確認ください。

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

同様の関数をもう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式です。
詳細な記述方法については、以下のページをご確認ください。

ルールのスケジュール式 - Amazon CloudWatch Events
Amazon CloudWatch Events で cron 式または rate 式を使用して AWS を自動化する方法について説明します。

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

ルールのスケジュール式 - Amazon CloudWatch Events
Amazon CloudWatch Events で cron 式または rate 式を使用して AWS を自動化する方法について説明します。

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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

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

  • 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関数を定期的に実行する方法を確認しました。

タイトルとURLをコピーしました