EventBridge -> Service Integration (Custom Event Transformer)
"Amazon CloudWatch Integration" は Metric Alarm 専用で、EventBridge には対応していません。
Service Integration で受け付ける方法は二通りあります。 2パターン目として Custom Event Transformer を使用します。
Custom Event Transformer Integration Guide | PagerDuty
受信したイベントを JavaScript により変換する機能です。 機能詳細については以下のドキュメント内に記載があります。
- PagerDuty DEVELOPER PLATFORM
- Custom Change Event Transformer
Amazon EventBridge Integration について
Amazon EventBridge Integration Guide | PagerDuty
EventBridge のインテグレーションは PagerDuty -> EventBridge の連携用です。
EventBridge -> PagerDuty の方向では使用できません。
導入
PagerDuty Service に "Custom Event Transformer" インテグレーションを追加し、Integration URL を取得します。

AWS SNS の Subscription に Integration URL を HTTPS Endpoint として指定します。

インテグレーションが初期状態(スクリプト未編集)の場合、"Custom Event Transform" の件名でインシデントが作成されるので、confirm を実施することで利用できるようになります。

PagerDuty Service での自動Resolve設定を行っていない限りは、Resolveされないので手動で実施します。
インシデント
インテグレーションが初期状態(スクリプト未編集)の場合で確認します。
スクリプトはインテグレーション設定で確認が行なえます。

rawBody にイベント内容が入ります。

重複排除
The transformer deduplicates events based upon the incident_key property within the normalized_event object.
normalized_event.incident_key で指定します。
var normalized_event = {
event_type: PD.Trigger,
description: "Custom Event Transform",
details: PD.inputRequest,
incident_key: XXXXX,
};
スクリプトの変更はインテグレーション設定から行います。

Event API v2
Event API には v1 と v2 のバージョンが有り、Custom Event Transformer の初期スクリプトは v1 となっています。
- Platform Extensibility with API v2 and the Custom Events Transformer | PagerDuty
- PagerDuty DEVELOPER PLATFORM
機能拡張されており、Severity の指定などはv2からの機能となります。
Custom Event Transformer のドキュメントは v1 配下に有り、v2についての明記はありません。
しかし、v1/v2 とも、 PD オブジェクトを使用する形となっており、Custom Event Transformer も v2 での記述が可能です。
v2版での PD オブジェクトについては DEVELOPER PLATFORM の "Writing App Event Transformers" ページが参考になります。
インシデント(v2版)
初期スクリプトをv2の記述に変更して確認します。
let body = PD.inputRequest.rawBody;
let normalized_event = {
event_action: PD.Trigger,
payload: {
summary: "Custom Event Transform v2",
source: "raw event",
severity: PD.Critical,
custom_details: body
},
};
PD.emitEventsV2([normalized_event]);

インシデント(v2 SNS版)
SNS のイベントに合わせて整形して確認します。
let body = JSON.parse(PD.inputRequest.rawBody);
let summary = body.TopicArn;
let custom_details = body;
if (body.Message) {
try {
custom_details.Message = JSON.parse(body.Message);
} catch(e) {
;
}
}
let normalized_event = {
event_action: PD.Trigger,
payload: {
summary: summary,
source: "sns",
severity: PD.Critical,
custom_details: custom_details
},
};
PD.emitEventsV2([normalized_event]);

注意点
スクリプトを編集した後に SNS Subscription の Confirm を行う場合、通常のメッセージ(Type:Notification) とは異なる形式でイベントが送信されます。 confirm を実施するためには、"Subscription Confirmation"(Type:SubscriptionConfirmation) の形式にもスクリプトが対応している必要があります。
