EventBridgeの入力トランスフォーマーを設定した時にハマったところ2点(コンソール/CloudFormation)
AWSを使っていたらEventBrdigeを使う場面はかなり多いと思います。
イベントルールを作成するときに入力トランスフォーマーというものを設定することができるのですが、地味にハマって時間を浪費してしまったので書き残していこうと思います。
入力トランスフォーマーとは?
AWSリソースからEventBridgeに届くイベントは情報量が多く複雑なデータ構造をしているので、そのままターゲットに情報を渡してしまうと、無駄なデータ処理を実装することになります。
入力トランスフォーマーでは、任意の形式のテンプレートを定義することで、ターゲットに渡す情報を自由に変換することが可能になります。
ハマった点1: テンプレートの出力のダブルクオーテーションをエスケープした時にイベントの作成に失敗する
こちらはコンソールで入力トランスフォーマーを設定した時にハマった内容になります。
入力トランスフォーマーを設定するときに、入力パスと入力テンプレートと出力の例を見ながら設定することができます。
上記を例を参考に、下記のような入力パスと入力テンプレートを定義してみます。
サンプルイベントを使って出力を試してみます。
エラーも発生せず問題なく出力されているように見えます。
テンプレート側でダブルクォーテーションで囲わなかった場合はそのまま出力され、囲った場合は囲った状態で出力されます。
ポイントは下段の出力で、テンプレート側でダブルクォーテーションをバックスラッシュでエスケープした場合にもダブルクォーテーションで囲われた状態で出力されます。
入力トランスフォーマーの設定の確認が済んだので、ルールを作成しようとします。
Invalid InputTemplate for target XXXXX : [Source: (String)" "accountld": null, "accountld": "null" "accountld": ("null!" "; line: 4, column: 4].
テンプレートの設定が不正でエラーが発生してルールの作成に失敗しました。
原因
出力を文字列にしたいのであれば、エスケープせずにダブルクォーテーションで囲むだけでいいみたいです。
出力のテストでエラーが発生せずに問題なさそうな出力が得られてしまったので気が付かなかったです。
ハマった点2: 入力トランスフォーマーの定義が不正でもスタックのデプロイは成功する
こちらはCloudFormationを使って定義した時にハマった内容です。
失敗した内容をコンソールで再現します。
入力イベントがこんな感じだったとします
入力パスとして配列を参照する値を定義します
入力テンプレートとして下記のように定義します
出力をテストしてみます
エラーになります。
これは正しい挙動で、入力パスで定義している値が配列なのに対して、入力テンプレートでその値をダブルクォーテーションで囲おうとして失敗しています。
コンソールで設定した場合であれば出力をテストする段階で失敗に気がつくので定義を修正することができます。
一方で、CloudFormationのYAMLファイルで入力トランスフォーマーの定義を記述した場合、YAMLのバリデーションはもちろん、スタックのデプロイまで問題なく成功します。
動作確認をしたときにイベントが発火せず、モニタリングを見た時にEventBridgeの実行に失敗していることに気がついたのでようやくミスが発覚しました。
原因
CloudFormation側では入力トランスフォーマーの定義の検証は行なっていないみたいです。
入力トランスフォーマーの定義をテストするには、コンソールでEventBridgeルールを作成して入力トランスフォーマーの定義の画面まで遷移させないといけないので面倒です。。。
まとめ
AWSリソースのトラブルシューティング能力を鍛えないとなと実感しました。
Discussion