Metric Alarm -> Global Orchestration
グローバルオーケストレーションのEndpointへイベントを通知します。 その内置き換わると思いますが、現時点では CloudWatch 固有のドキュメントはありません。
導入方法は上記の Global Orchestrations を参考にします。 前回のGlobal Ruleset と似たような感じです。
導入
PagerDuty "Automation" -> "Event Orchestration"。 初期状態では空です。
"New Orchestration" からオーケストレーションを作成し、 "Global Orchestration Key" 内の Integration Key を使用します。
Integration URL はドキュメントに記載がありませんが、 グローバルルールセット同様、以下の形式で指定します。
https://events.pagerduty.com/x-ere/[YOUR_INTEGRATION_KEY_HERE]
AWS SNS の Subscription に Integration URL を HTTPS Endpoint として指定します。 自動的に Confirm されます。
Rule はまだ設定していない状態ですが、Alert が発行され comfirm されます。 Ruleset とは異なり、PDAutoSubscribe の出力は有りませんでした。
インシデント発行する Rule が設定済みである場合、 インシデントタイトル "Incident routed via a Ruleset" で発行されます。
ルール(ルーティング)
初期状態では 何もしない ルールのみが存在します。
イベント受信時にインシデント発行を行うため、"New Service Route"から新しいルールを追加します。
ルール作成画面の右画面に受信したイベント履歴が出力されます。 事前に Integration URL にイベント発行を行っておくとルール作成がしやすいと思います。
ルーティングルール
例として、Service への振り分け条件を TopicArnとします。
CEF 形式でないため、 raw_event.TopicArn
としています。
参考: Common Event Format (PD-CEF)
サービスルール
作成したルーティングルールのサービスルールを編集します。
初期状態では Default Behavior
ルールのみ存在し、イベントを受信すると Severity: Critical
でインシデントを発行します。
ビジュアルエディタが開くので "New Rule" にルールを追加します。 例として、Severity を warning でインシデント発行するルールにします。
- Conditions
- Alert Actions
- 一覧(条件が複数ある場合は右上のメニューの Move... で優先順変更)
尚、ルールセットのネストはオプションとのことです。
条件の追加は "Add Sibling Below" で行えます。
インシデント
インシデントタイトルは SNSから通知される $.Subject
で作成されます。
{NewStateValue}: \"{AlarmName}\" in {Region}
詳細欄にはSNSから通知される $.Message
が入ります。
ルールで指定した通り、Severity を warning としている事が確認できます。
OK Action 通知での Resolve はされません。
受信したイベント履歴を見ると、"event_action": "resolve"
となっているので Resolve されることを期待したのですが、ルールを調整する必要があるようです。
Resolve
サービスルールにルールを追加して "OK Action" 受信時にインシデントを Resolve するようにします。
ALARM 用ルール
追加済みのルールの Condition を 件名(Subject) に "ALARM:" を含むという条件に編集します。
`raw_event.Subject` matches part "ALARM:"
OK 用ルール
Condition "Always" のルールを追加します。 Alert Actions で Resolve を指定します。
ルール追加を行った状態は以下のようになります。
受信確認
"OK" を受け取った際にインシデントの Resolve が行われます。
- Alert Log
- Incident Timeline
課題: イベントの形式差異
上記では "ALARM" を条件に Trigger、それ以外を Resolve としています。 本来は逆の条件("OK"を条件に Resolve、それ以外をTrigger)が良かったのですが振り分けが期待通り動作せず断念しました。
詳細は不明ですが、"OK"受信時の Condition が効かない状態でした。 "Examples of recent events" を見ると、"ALARM" と "OK" で表示差異があり、イベント形式が異なっているのではないかと思います。(イベント内容は一緒なので謎ではありますが...)
グローバルとサービス
サービスオーケストレーションの設定は、 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 から参照した場合
- Service から参照した場合
重複排除
Ruleの "Transformations" から変更します。