vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

AWS から PagerDuty への通知連携(6)

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 により変換する機能です。 機能詳細については以下のドキュメント内に記載があります。



Amazon EventBridge Integration について

Amazon EventBridge Integration Guide | PagerDuty

EventBridge のインテグレーションは PagerDuty -> EventBridge の連携用です。
EventBridge -> PagerDuty の方向では使用できません。

導入

PagerDuty Service に "Custom Event Transformer" インテグレーションを追加し、Integration URL を取得します。

f:id:htnosm:20220403140747p:plain

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

f:id:htnosm:20220403140750p:plain

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

f:id:htnosm:20220403140755p:plain

PagerDuty Service での自動Resolve設定を行っていない限りは、Resolveされないので手動で実施します。

インシデント

インテグレーションが初期状態(スクリプト未編集)の場合で確認します。

スクリプトはインテグレーション設定で確認が行なえます。

f:id:htnosm:20220403140759p:plain

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

f:id:htnosm:20220403140803p:plain

重複排除

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,
};

スクリプトの変更はインテグレーション設定から行います。

f:id:htnosm:20220403140808p:plain

Event API v2

Event API には v1 と v2 のバージョンが有り、Custom Event Transformer の初期スクリプトは v1 となっています。

機能拡張されており、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]);

f:id:htnosm:20220403140812p:plain

インシデント(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]);

f:id:htnosm:20220403140816p:plain

注意点

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

f:id:htnosm:20220407030919p:plain