Lambda関数を定期的に実行する
EventBridgeを使用することで、定期的なアクションを設定することができます。
今回はLambda関数を定期的に実行します。
構築する環境
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関数を作成する方法については、以下のページをご確認ください。
コードの内容ですが、現在日時を取得し、出力するものとなります。
同様の関数をもう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式です。
詳細な記述方法については、以下のページをご確認ください。
2つ目はcron式です。
詳細な記述方法については、以下のページをご確認ください。
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つ目のルールから確認します。
rate式でスケジュールが設定されていることがわかります。
対象のリソースを見ると、1つ目のLambda関数が指定されていることもわかります。
次に2つ目のルールを確認します。
cron式でスケジュールが設定されていることがわかります。
そして2つ目のLambda関数がターゲットとして指定されていることもわかります。
動作確認
準備が整いましのたので、2つの関数の実行ログを確認します。
まずrate式でスケジュールした1つ目の関数のログを確認します。
1分おきに日時データが書き込まれていることがわかります。
確かにrate式によって、1分ごとにLambda関数が実行されてことがわかります。
次にcron式でスケジュールした2つ目の関数のログを確認します。
こちらも1分おきに日時データが書き込まれていることがわかります。
確かにcron式によっても、1分ごとにLambda関数が実行されてことがわかります。
まとめ
EventBridgeのスケジュール式(rate式/cron式)使用することで、Lambda関数を定期的に実行する方法を確認しました。