はじめに

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 に期待した内容でインシデントが起票されました。

まとめ

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