EventBridge で Lambda 関数を実行する際に入力トランスフォーマーを利用する
問題
毎分Lambda関数を実行したい。
実行時、実行時刻の00秒の時刻をLambda関数に引数として渡したい。
が、どうすれば良いか。
対応
EventBridgeの入力トランスフォーマーを利用する。
EventBridgeの ルール作成
ボタンから、ルール作成画面を表示する。
今回の要件は 毎分Lambda関数を実行したい
なので、ルールタイプはスケジュールを選択する。
* * ? * * *
でCron式を設定する。
ターゲットはLambda関数を選択し、機能欄は利用したいLambda関数を選択する。
追加設定の ターゲット入力を設定
欄で 入力トランスフォーマー
を選択する。
入力トランスフォーマーを設定
を押す。
設定画面が表示される。
サンプルイベントは EventBridge
の Scheduled Event
を選択する。
下記のようなサンプルイベントが表示される。
EventBridgeからLambda関数にこのデータが引数として渡されるということ。
今回は、このデータの time
を利用する。
サンプルイベントでは 2016-12-30T18:44:49Z
となっているが、* * ? * * *
でCron式で実行した場合は00秒の時刻が入るため、要件を満たす。
仮にLambda関数が foo_time
という引数を受け付けるとすると、下記のように入力パスとテンプレートを記述する。
入力パスにおいて、 $.time
で、イベントデータの time
keyの値を参照できる。
ここでは time
の値を foo_time
として取り扱い、テンプレートで "foo_time": <foo_time>
と記述することでLambda関数に渡す引数を構築している。
<foo_time>
と書くことで、入力パスで定義した値を参照できる。
「出力を生成」ボタンを押すと、サンプルイベントの場合にどういう値がLambda関数に渡るかを確認できる。
あとは、ステップ5まで進めてルール作成を完了する。
これで、毎分Lambda関数を実行して、かつ、実行時、実行時刻の00秒の時刻をLambda関数に引数として渡すことができる。
余談
EventBridgeのイベントをそのまま渡しても要件は実現できるが、関数がEventBridgeのイベントインターフェイスに依存すると保守性が下がりそうなので採用していない。
"$.time"
の $
が何を意味しているのか、 https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-transform-target-input.html を読んでもあまり理解できず、試行錯誤時、時間を使った。
サンプルイベントを選択しないと「出力を生成」ボタンが表示されず、どういう出力になるか確認できない。
* * ? * * *
でCron式で実行した場合は00秒の時刻が入る、というのは仕様かどうかは不明。現状確認できている範囲ではそういう動きをしているが、誤差があったり今後変更されたりすることがあるかもしれない。
Discussion