はじめに
Amazon EventBridge で検知したイベントをPagerDutyに任意のインシデントタイトルで通知したいと思います。
全体構成とアーキテクチャ
今回は、RDS のフェイルオーバーイベントを検知する EventBridge Rule を作成します。
RDS のイベントは、イベントサブスクリプション + SNS でも通知できますが、インシデントタイトルを変えたいので、EventBridge の入力トランスフォーマーでインシデント情報を編集したいと思います。
Lambda 等の仲介リソースを使わず、EventBridge の以下の機能を使用して連携します。

| 構成要素 | 役割 |
|---|---|
| EventBridge Rule | 対象となるAWSイベントをフィルタリングし、入力トランスフォーマーでインシデント情報を編集 |
| API Destination | PagerDuty の Events API v2 エンドポイントへ HTTP POST を送信 |
設定手順
1. PagerDuty 側で Integration Key / URL を取得
- 該当の PagerDuty Service 画面から Integrations タブを開きます。
- 「 Events API v2 」を追加し、生成された Integration Key / URL を確認します。

2. EventBridge の接続( Connection )と送信先( API Destination )を作成
(1) 左のメニューから「API の送信先」を開いて、「API送信先を作成」をクリックします。
(2) 以下の画面となるので、必要事項を入力します。

| 名前 | 任意の名前を入力 |
|---|---|
| API 送信先エンドポイント | PagerDuty の Integration URL |
| HTTPメソッド | POST |
(3) 「接続タイプ」の項目で「新しい接続先を作成」を選択すると、接続に関する入力項目が表示されるので、以下の内容で登録します。

接続設定
| 項目 | 値 |
|---|---|
| 接続名 | 任意の名前を入力 |
| APIタイプ | パブリック |
呼び出しを設定
| 項目 | 値 |
|---|---|
| 認証を設定 | カスタム設定 |
| 認証タイプ | APIキー |
| API キー名 | ダミーの文字列を入力 |
| 値 | ダミーの文字列を入力 |
認証タイプはいずれかを選択する必要があるので「APIキー」を設定しています。「API キー名,値」に設定した内容はヘッダに追加されますが、PagerDuty(Events API v2)は認証情報をJSON本文(ボディ)に設定するため、ここでは任意の文字列を指定しています。
呼び出し Http パラメータ
| 項目 | 値 |
|---|---|
| パラーメータ | シークレットの本文フィールド |
| キー | routing_key |
| 値 | PagerDuty の Integration Key |
シークレット値を使用した場合、登録したシークレット情報は、AWS Secrets Manager に保存されます。
(4) 入力が完了したら「作成」をクリックします。新しく「接続」と「APIの送信先」が作成されます。
3. EventBridge Rule の作成と Payload 整形
(1) 左のメニューから「ルール」を開いて、「ルールを作成」をクリックします。
(2) ビルダーモードは「アドバンスドビルダー」を選択して以下を設定していきます。

※ 「強化ビルダー」で設定した場合、以下の記事で紹介されていおります通り、JSONの構文エラーに関する不具合が発生する可能性があります。
Amazon EventBridgeビジュアルルールビルダーの不具合について
(3) 任意のルール名を入力して次に進みます。
(4) イベントパターンでは、以下の内容で入力して次に進みます。
- イベントソースで「その他」を選択します。
- 作成のメソッドで「カスタムパターン (JSON エディタ)」を選択し、以下のJSONを入力します。(検知するイベントはフェイルオーバーのみにしています。)
{
"source": ["aws.rds"],
"detail-type": ["RDS DB Instance Event"],
"detail": {
"EventID": ["RDS-EVENT-0013"],
"SourceArn": ["対象RDSのArn"]
}
}

(5) ターゲットを選択:以下の内容で入力して次に進みます。
- 先ほど作成したAPI送信先を選択します。
- 追加設定を開き、「ターゲット入力を設定」で入力トランスフォーマーを選択します。

- 入力トランスフォーマーを設定のボタンが表示されるので、クリックして以下を入力します。

入力パス
{
"account":"$.account",
"detail_type":"$.detailtype",
"event_id":"$.detail.EventID",
"event_message":"$.detail.Message",
"event_time":"$.time",
"id":"$.id",
"region":"$.region",
"resource_arn":"$.detail.SourceArn",
"source":"$.source",
"source_id":"$.detail.SourceIdentifier"
}
テンプレート
Send an event to PagerDuty を参考にインシデント情報を指定します。
今回、インシデントタイトルは、[Alert] RDS-Failover-Event target:test-rds にします。
{
"event_action": "trigger",
"dedup_key": "<id>",
"payload": {
"summary": "[Alert] RDS-Failover-Event target:test-rds",
"source": "<source>",
"severity": "critical",
"timestamp": "<event_time>",
"custom_details": {
"AWSAccountId": "<account>",
"Region": "<region>",
"Service": "RDS",
"EventID": "<event_id>",
"EventMessage": "<event_message>",
"SourceIdentifier": "<source_id>",
"SourceArn": "<resource_arn>",
"EventBridgeID": "<id>",
"DetailType": "<detail_type>"
}
}
}
(6) 入力内容を確認した後、ルールを作成をクリックします。
4. 検証
RDS を手動でフェイルオーバーさせたところ、PagerDuty に期待した内容でインシデントが起票されました。

まとめ
通知する際にインシデント情報を編集したい場合には、今回紹介した入力トランスフォーマーを使用するのが便利かと思いました。少しでも参考になりましたら幸いです。