🥕

EventBridge で Lambda 関数を実行する際に入力トランスフォーマーを利用する

2022/09/25に公開

問題

毎分Lambda関数を実行したい。
実行時、実行時刻の00秒の時刻をLambda関数に引数として渡したい。
が、どうすれば良いか。

対応

EventBridgeの入力トランスフォーマーを利用する。


EventBridgeの ルール作成 ボタンから、ルール作成画面を表示する。


今回の要件は 毎分Lambda関数を実行したい なので、ルールタイプはスケジュールを選択する。


* * ? * * * でCron式を設定する。


ターゲットはLambda関数を選択し、機能欄は利用したいLambda関数を選択する。


追加設定の ターゲット入力を設定 欄で 入力トランスフォーマー を選択する。


入力トランスフォーマーを設定 を押す。


設定画面が表示される。


サンプルイベントは EventBridgeScheduled 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