EventBridge 入力トランスフォーマーで Security Hub CSPM の通知をちょっと見やすくする
はじめに
Security Hub CSPM の通知を Amazon Q Developer in chat applications (以降は Amazon Q Developer と記載します) を利用して Slack 等に通知されている方も多いと思います。
特別な設定を加えない限り、通知先のタイトルには下記のように AWS アカウント ID が含まれますが、管理対象のアカウントが複数あると、どのアカウントの通知か分かりづらいのが悩みどころです。

これが「AWS アカウント ID」でなく、「AWS アカウント名」を連携してくれたらどのアカウントに対して届いた通知かが分かりやすくなりますよね。そして、これが Lambda を書かずに実現できたら更によいですよね。
そこで、本記事では EventBridge 入力トランスフォーマーを利用して Amazon Q Developer への Security Hub CSPM の通知に AWS アカウント名 を含める方法について紹介します。
EventBridge 入力トランスフォーマーについて
イベントデータを送信先に渡す前に、あらかじめ指定しておいたデータ形式に変更する EventBridge の機能です。これにより、元のイベントから必要な情報だけを抽出したり、メッセージを読みやすい形式に整形したりすることができます。

本記事では、AWS アカウント ID の連携部分を AWS アカウント名に差し替えるために利用します。
入力トランスフォーマーの詳細については下記をご確認ください。
Security Hub CSPM イベントへの入力トランスフォーマーの適用
入力トランスフォーマー適用前後で、Amazon Q Developer に連携される項目に入力パスと入力テンプレートを指定します。
入力パス
Security Hub CSPM イベントから必要なデータを JSON パスで抽出し、変数として定義します。
例えば $.detail.findings[0].AwsAccountName からアカウント名を取得して findingsAwsAccountName 変数に格納します。
Security Hub CSPM のイベント形式の詳細については下記をご確認ください。
{
"findingsAwsAccountName": "$.detail.findings[0].AwsAccountName",
"findingsDescription": "$.detail.findings[0].Description",
"findingsFirstObservedAt": "$.detail.findings[0].FirstObservedAt",
"findingsId": "$.detail.findings[0].Id",
"findingsLastObservedAt": "$.detail.findings[0].LastObservedAt",
"findingsProductFields": "$.detail.findings[0].ProductFields",
"findingsResources": "$.detail.findings[0].Resources",
"findingsSeverity": "$.detail.findings[0].Severity",
"findingsTitle": "$.detail.findings[0].Title",
"findingsTypes": "$.detail.findings[0].Types",
"id": "$.id",
"region": "$.region",
"resources": "$.resources",
"time": "$.time"
}
入力テンプレート
入力パスで定義した変数を使用して、Amazon Q Developer に渡す JSON データの構造を指定します。
{
"version": "0",
"id": <id>,
"detail-type": "Security Hub Findings - Imported",
"source": "aws.securityhub",
"account": <findingsAwsAccountName>,
"time": <time>,
"region": <region>,
"resources": <resources>,
"detail": {
"findings": [{
"Id": <findingsId>,
"AwsAccountId": <findingsAwsAccountName>,
"Types": <findingsTypes>,
"FirstObservedAt": <findingsFirstObservedAt>,
"LastObservedAt": <findingsLastObservedAt>,
"Severity": <findingsSeverity>,
"Title": <findingsTitle>,
"Description": <findingsDescription>,
"ProductFields": <findingsProductFields>,
"Resources": <findingsResources>
}]
}
}
ポイントは、通常 AWS アカウント ID (数字 12 桁) が入る以下の 2 つのフィールドに、<findingsAwsAccountName> 変数 (アカウント名) を割り当てることです。
-
"account": <findingsAwsAccountName>:- 通常は AWS アカウント ID が入るフィールドですが、このフィールドにアカウント名を指定します。
-
"AwsAccountId": <findingAwsAccountName>:- このフィールドも通常は AWS アカウント ID が入るフィールドですが、これにもアカウント名を指定しておきます。
※ Amazon Q Developer が通知詳細を表示する際に参照する可能性があるため、一貫性を保つために同じくアカウント名に差し替えます。
- このフィールドも通常は AWS アカウント ID が入るフィールドですが、これにもアカウント名を指定しておきます。
これにより、Amazon Q Developer が通知を表示する際に、アカウント ID の代わりにアカウント名が表示され、複数アカウントを管理している場合でもどのアカウントからの通知かを容易に判断できるようになります。
通知例
先ほどの EventBridge 入力トランスフォーマーを適用すると、Slack では通知の表示が以下のように変わります。

タイトル部分のアカウント表示が、数字の ID からアカウント名に変わっていることが確認できます。
さいごに
EventBridge 入力トランスフォーマーを利用することで、 Lambda を書くことなく Security Hub CSPM の通知タイトルを見やすくカスタマイズできました。
ただし、今回の方法は本来 AWS アカウント ID が入るフィールドにアカウント名を差し込むという、若干ハック的なアプローチです。将来的には Amazon Q Developer の通知機能そのものでアカウント名の連携に対応してくれると、自然な形で実現できて嬉しいですね。
通知の視認性を高めたい際に、今回紹介した方法をお試しいただければと思います。
私たち BABY JOB は、子育てを取り巻く社会のあり方を変え、「すべての人が子育てを楽しいと思える社会」の実現を目指すスタートアップ企業です。圧倒的なぬくもりと当事者意識をもって、子どもと向き合う時間、そして心のゆとりが生まれるサービスを創出します。baby-job.co.jp/
Discussion