【小ネタ】 EventBridge InputTransformer の複数行テンプレートで SNS メールにダブルクォートが残った話

【小ネタ】 EventBridge InputTransformer の複数行テンプレートで SNS メールにダブルクォートが残った話

2026.05.31

はじめに

こんにちは、クラスメソッドの板倉です。

Security Hub の検出結果を EventBridge → SNS 経由でメール通知する仕組みを CLI で構築していたところ、InputTransformer の複数行テンプレートで AWS 公式ドキュメント通りに書いたのに、配信されたメール本文に ダブルクォートがそのまま残ってしまう 事象に遭遇しました。

小ネタですが備忘も兼ねてブログにしてみました。

結論

  • EventBridge InputTransformerInputTemplate に複数行プレーンテキストを入れる場合、各行をダブルクォート (") で囲む のが公式仕様
  • この ダブルクォートは配信時に除去されない
  • コンソール のプレビュー画面でも同じ結果になるため、コンソール / API の挙動差ではなく仕様
  • メール本文を綺麗に整形したい場合は EventBridge → Lambda → SNS のように Lambda を挟む必要がある

やりたかったこと

Security Hub Findings を以下のようなフォーマットでメール通知したかったです。

[Security Hub] CRITICAL - S3.1

Account: 1234XXXXXXXX
Region: ap-northeast-1
Title: S3.1 S3 General purpose buckets should have block public access settings enabled
Resource: arn:aws:s3:::example-bucket

This control checks whether ...

Finding ID: arn:aws:securityhub:...

▼ コントロール詳細ページ
https://ap-northeast-1.console.aws.amazon.com/securityhub/home?region=ap-northeast-1#/controls/S3.1

Security Hub Findings - Imported イベントを EventBridge Rule で拾い、InputTransformer で整形して SNS Topic に送る構成です。

eventbridge-sns-input-transformer.png

公式ドキュメントの記載

Amazon EventBridge input transformation には複数行プレーンテキストについてこう書いてあります。

For (non-JSON) text output as multi-line strings, wrap each separate line in your input template in double quotes.

つまり「複数行プレーンテキストにしたいなら、各行をダブルクォートで囲んで並べる」ということです。例も以下のように書かれています。

"<severity> severity finding <title>"
"Description: <description>"
"ARN: \"<arn>\""
"Type: <type>"

素直に読めば「ダブルクォートは囲み文字として処理される、出力には残らない」と解釈しませんか…?

公式仕様で書いてみた結果

検証は CLI から aws events put-targets --targets file://... で JSON ファイル経由で InputTemplate を投入し、テスト用 EventBridge Rule → SNS Topic → Email サブスクライブで配信メールを確認する構成で実施しました。

公式ドキュメントに沿って、各行をダブルクォート (") で囲んで実改行で連結する形で書きます。

lines = [
  '"[Security Hub] <severity> - <controlId>"',
  '""',
  '"Account: <account>"',
  '"Region: <region>"',
  ...
]
"InputTemplate": '\n'.join(lines)

put-targets は成功、改行も意図通り出力される。ですが、メール本文には 各行のダブルクォートがそのまま残った状態 で配信されました。

公式仕様で書いた配信メール.png

つまり改行はちゃんとできるけど、" も付いてくる…。

AWS コンソール のプレビューでも同じ

「もしかして CLI と コンソール で挙動が違うのでは?」と思い、AWS コンソール の EventBridge Rule 編集画面で Input transformerTemplate 欄に同じ内容(各行 "...")を直接入力し、Output 欄のプレビューを確認しました。

結果は Output 欄でもダブルクォートが残ったまま表示。コンソール と CLI で挙動差はなく、ダブルクォート除去は AWS 側で実装されていないようです。

ちなみに Template 欄に外側ダブルクォートなしの素のテキスト を貼り付けた場合は、コンソール 側で「文字列テンプレートには引用符が必要です」とエラーになります。"..." で囲むのは必須仕様ということですね。

回避策

1. ダブルクォート残存を許容する

「メール本文に " が残るが情報はちゃんと伝わる」という割り切りができるなら、追加実装ゼロで済みます。フィールド名・値が " で囲まれた YAML / JSON ライクな見た目になるので、これはこれで構造化メッセージとして読めなくはない・・・ということで許容できるならこのままでも良いかと思います。

2. Lambda を挟んで自由に整形する

完全に綺麗な本文にしたい場合は、EventBridge → Lambda → SNS の構成にすることで、InputTransformer の制約から離れて Lambda 内でメール本文を自由に整形できます。

まとめ

  • EventBridge InputTransformer で複数行プレーンテキストを生成するには、公式仕様通り 各行をダブルクォート (") で囲んで並べる 必要がある
  • ただし配信時にダブルクォートは除去されず、メール本文にそのまま残る(AWS コンソール プレビューでも同じ)
  • 完全に整形された通知メールがほしい場合は Lambda を挟む 必要がある
  • ダブルクォート残存を許容するか、Lambda を挟むかはユースケース次第

この挙動を事前に知っておけば設計時に Lambda を挟むかどうかの判断ができるかなと思います。

どなたかの参考になれば幸いです。
以上、クラウド事業本部 コンサルティング部のいたくら(@itkr2305)でした!

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事