vague memory

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

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

Metric Alarm -> Global Orchestration

グローバルオーケストレーションのEndpointへイベントを通知します。 その内置き換わると思いますが、現時点では CloudWatch 固有のドキュメントはありません。

Event Orchestration

導入方法は上記の Global Orchestrations を参考にします。 前回のGlobal Ruleset と似たような感じです。


導入

PagerDuty "Automation" -> "Event Orchestration"。 初期状態では空です。

f:id:htnosm:20220328063517p:plain

"New Orchestration" からオーケストレーションを作成し、 "Global Orchestration Key" 内の Integration Key を使用します。

f:id:htnosm:20220328063522p:plain

Integration URL はドキュメントに記載がありませんが、 グローバルルールセット同様、以下の形式で指定します。

https://events.pagerduty.com/x-ere/[YOUR_INTEGRATION_KEY_HERE]

AWS SNS の Subscription に Integration URL を HTTPS Endpoint として指定します。 自動的に Confirm されます。

f:id:htnosm:20220328063540p:plain

Rule はまだ設定していない状態ですが、Alert が発行され comfirm されます。 Ruleset とは異なり、PDAutoSubscribe の出力は有りませんでした。

f:id:htnosm:20220328063545p:plain

f:id:htnosm:20220328063549p:plain

インシデント発行する Rule が設定済みである場合、 インシデントタイトル "Incident routed via a Ruleset" で発行されます。

ルール(ルーティング)

初期状態では 何もしない ルールのみが存在します。

f:id:htnosm:20220328063834p:plain

イベント受信時にインシデント発行を行うため、"New Service Route"から新しいルールを追加します。

ルール作成画面の右画面に受信したイベント履歴が出力されます。 事前に Integration URL にイベント発行を行っておくとルール作成がしやすいと思います。

f:id:htnosm:20220328063838p:plain

ルーティングルール

例として、Service への振り分け条件を TopicArnとします。 CEF 形式でないため、 raw_event.TopicArn としています。 参考: Common Event Format (PD-CEF)

f:id:htnosm:20220328063842p:plain

サービスルール

作成したルーティングルールのサービスルールを編集します。
初期状態では Default Behavior ルールのみ存在し、イベントを受信すると Severity: Critical でインシデントを発行します。

f:id:htnosm:20220328063845p:plain

ビジュアルエディタが開くので "New Rule" にルールを追加します。 例として、Severity を warning でインシデント発行するルールにします。

f:id:htnosm:20220328063849p:plain

  • Conditions

f:id:htnosm:20220328064442p:plain

  • Alert Actions

f:id:htnosm:20220328064445p:plain

  • 一覧(条件が複数ある場合は右上のメニューの Move... で優先順変更)

f:id:htnosm:20220328064450p:plain

尚、ルールセットのネストはオプションとのことです。

f:id:htnosm:20220328064454p:plain

条件の追加は "Add Sibling Below" で行えます。

f:id:htnosm:20220328064458p:plain

インシデント

インシデントタイトルは SNSから通知される $.Subject で作成されます。

{NewStateValue}: \"{AlarmName}\" in {Region}

f:id:htnosm:20220328065207p:plain

詳細欄にはSNSから通知される $.Message が入ります。

f:id:htnosm:20220328065421p:plain

ルールで指定した通り、Severity を warning としている事が確認できます。

f:id:htnosm:20220328065216p:plain

OK Action 通知での Resolve はされません。

f:id:htnosm:20220328065220p:plain

受信したイベント履歴を見ると、"event_action": "resolve" となっているので Resolve されることを期待したのですが、ルールを調整する必要があるようです。

Resolve

サービスルールにルールを追加して "OK Action" 受信時にインシデントを Resolve するようにします。

ALARM 用ルール

追加済みのルールの Condition を 件名(Subject) に "ALARM:" を含むという条件に編集します。

`raw_event.Subject` matches part "ALARM:"

f:id:htnosm:20220403062536p:plain

OK 用ルール

Condition "Always" のルールを追加します。 Alert Actions で Resolve を指定します。

f:id:htnosm:20220403062541p:plain

ルール追加を行った状態は以下のようになります。

f:id:htnosm:20220403062544p:plain

受信確認

"OK" を受け取った際にインシデントの Resolve が行われます。

  • Alert Log
    • f:id:htnosm:20220403062548p:plain
  • Incident Timeline
    • f:id:htnosm:20220403062551p:plain

課題: イベントの形式差異

上記では "ALARM" を条件に Trigger、それ以外を Resolve としています。 本来は逆の条件("OK"を条件に Resolve、それ以外をTrigger)が良かったのですが振り分けが期待通り動作せず断念しました。

詳細は不明ですが、"OK"受信時の Condition が効かない状態でした。 "Examples of recent events" を見ると、"ALARM" と "OK" で表示差異があり、イベント形式が異なっているのではないかと思います。(イベント内容は一緒なので謎ではありますが...)

f:id:htnosm:20220403062555p:plain

グローバルとサービス

サービスオーケストレーションの設定は、 PagerDuty Service -> Settings -> "Event Management" -> "Service Orchestration Rules" からも辿れます。 (エディタの表示が統合されていて少々混乱しました。)

Global Orchestrations

When an incoming event stream has more than one service destination, you can use Global Orchestrations to route events from the same source to different services.

グローバルオーケストレーションは Service へのルーティング機能のみです。

Service Orchestrations

When integrations exist on a service, you can use Service Orchestrations to evaluate your incoming events and perform additional actions.

以降のアクション実行はサービスオーケストレーションの機能です。

  • Orchestration から参照した場合

f:id:htnosm:20220328070127p:plain

  • Service から参照した場合

f:id:htnosm:20220328070131p:plain

重複排除

Ruleの "Transformations" から変更します。

f:id:htnosm:20220328070134p:plain