AWS Incident Manager によるインシデント発生時のエスカレーション自動化を試してみた
こんにちは、株式会社モリサワ システム開発部門の川村です。
AWS Incident Manager
を利用して、インシデントの発生を検知し、自動的にエスカレーションする方法を試してみたので、簡単に紹介したいと思います。
Incident Manager とは?
AWS が提供するインシデント解決までの時間を短縮するための支援を行うサービスです。
主な機能としては以下が挙げられます。
インシデント検知
Amazon CloudWatch アラーム、Amazon EventBridge イベントをトリガーに、インシデントの発生を検知することができます。
エスカレーション
インシデント発生時に自動的に担当者に連絡することができます。固定のエスカレーションフローのほか、曜日や時間帯によるシフトを設定することもできます。
チャットチャネル連携
インシデントの状況を Slack、Microsoft Teams、Amazon Chime に連携することができます。
Runbook 呼び出し
インシデント発生時に AWS Systems Manager Automation の Runbook[1] を呼び出すことができます。
事後分析
インシデントのレポートを作成することができ、既定のテンプレートのほか、カスタムテンプレートを使用することもできます。
実装
以下のエスカレーションフローを構築したいと思います。
- CloudWatch アラームでインシデント検知
- 太郎→次郎→三郎の順に5分間隔でエスカレーション
- 太郎は電話、次郎は SMS、三郎は E メール で連絡を受け取る
マネジメントコンソール上でも設定できますが、せっかくなので IaC で対応したいと思います。以下は CloudFormation(YAML)での実装例です。
Resources:
# 連絡先
## 太郎
TaroContact:
Type: AWS::SSMContacts::Contact
Properties:
Alias: taro
DisplayName: taro
Type: PERSONAL
TaroContactChannelVOICE:
Type: AWS::SSMContacts::ContactChannel
Properties:
ContactId: !Ref TaroContact
ChannelName: taro-VOICE
ChannelType: VOICE
ChannelAddress: <YourTelephoneNumber>
TaroEngagementPlan:
Type: AWS::SSMContacts::Plan
Properties:
ContactId: !Ref TaroContact
Stages:
- DurationInMinutes: 1
Targets:
- ChannelTargetInfo:
ChannelId: !Ref TaroContactChannelVOICE
RetryIntervalInMinutes: 0
## 次郎
JiroContact:
Type: AWS::SSMContacts::Contact
Properties:
Alias: jiro
DisplayName: jiro
Type: PERSONAL
JiroContactChannelSMS:
Type: AWS::SSMContacts::ContactChannel
Properties:
ContactId: !Ref JiroContact
ChannelName: jiro-SMS
ChannelType: SMS
ChannelAddress: <YourTelephoneNumber>
JiroEngagementPlan:
Type: AWS::SSMContacts::Plan
Properties:
ContactId: !Ref JiroContact
Stages:
- DurationInMinutes: 1
Targets:
- ChannelTargetInfo:
ChannelId: !Ref JiroContactChannelSMS
RetryIntervalInMinutes: 0
## 三郎
SaburoContact:
Type: AWS::SSMContacts::Contact
Properties:
Alias: saburo
DisplayName: saburo
Type: PERSONAL
SaburoContactChannelEMAIL:
Type: AWS::SSMContacts::ContactChannel
Properties:
ContactId: !Ref SaburoContact
ChannelName: saburo-EMAIL
ChannelType: EMAIL
ChannelAddress: <YourEmailAddress>
SaburoEngagementPlan:
Type: AWS::SSMContacts::Plan
Properties:
ContactId: !Ref SaburoContact
Stages:
- DurationInMinutes: 1
Targets:
- ChannelTargetInfo:
ChannelId: !Ref SaburoContactChannelEMAIL
RetryIntervalInMinutes: 0
# エスカレーションプラン
EmergencyEscalationPlanContact:
Type: AWS::SSMContacts::Contact
Properties:
Alias: emergency-escalation-plan
DisplayName: emergency-escalation-plan
Type: ESCALATION
EmergencyEscalationPlan:
Type: AWS::SSMContacts::Plan
Properties:
ContactId: !Ref EmergencyEscalationPlanContact
Stages:
- DurationInMinutes: 5
Targets:
- ContactTargetInfo:
ContactId: !Ref TaroContact
IsEssential: true
- DurationInMinutes: 5
Targets:
- ContactTargetInfo:
ContactId: !Ref JiroContact
IsEssential: true
- DurationInMinutes: 0
Targets:
- ContactTargetInfo:
ContactId: !Ref SaburoContact
IsEssential: true
# 対応プラン
EmergencyResponsePlan:
Type: AWS::SSMIncidents::ResponsePlan
Properties:
Name: emergency-response-plan
DisplayName: emergency-response-plan
Engagements:
- !Ref EmergencyEscalationPlan
IncidentTemplate:
Impact: 3
Title: Emergency Occurred
# アラーム
EmergencyAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: emergency-alarm
ActionsEnabled: true
AlarmActions:
- !Ref EmergencyResponsePlan
# 以下適切なアラーム設定が必要
ポイントとなるのは以下の部分です。
連絡先
各人の連絡先とエンゲージメントプランを定義します。
チャネルには電話、SMS、E メールが使用でき、複数登録することもできます。エンゲージメントプランでは、各チャネルに連絡が届くタイミングを設定することができます。
TaroContact:
Type: AWS::SSMContacts::Contact
Properties:
Alias: taro
DisplayName: taro
Type: PERSONAL
TaroContactChannelVOICE:
Type: AWS::SSMContacts::ContactChannel
Properties:
ContactId: !Ref TaroContact
ChannelName: taro-VOICE
ChannelType: VOICE
ChannelAddress: <YourTelephoneNumber>
TaroEngagementPlan:
Type: AWS::SSMContacts::Plan
Properties:
ContactId: !Ref TaroContact
Stages:
- DurationInMinutes: 1
Targets:
- ChannelTargetInfo:
ChannelId: !Ref TaroContactChannelVOICE
RetryIntervalInMinutes: 0
エスカレーションプラン
エスカレーションのルールを定義します。
ステージはエスカレーションの順番を表し、1ステージに複数人を登録することもできます。
EmergencyEscalationPlanContact:
Type: AWS::SSMContacts::Contact
Properties:
Alias: emergency-escalation-plan
DisplayName: emergency-escalation-plan
Type: ESCALATION
EmergencyEscalationPlan:
Type: AWS::SSMContacts::Plan
Properties:
ContactId: !Ref EmergencyEscalationPlanContact
Stages:
- DurationInMinutes: 5
Targets:
- ContactTargetInfo:
ContactId: !Ref TaroContact
IsEssential: true
- DurationInMinutes: 5
Targets:
- ContactTargetInfo:
ContactId: !Ref JiroContact
IsEssential: true
- DurationInMinutes: 0
Targets:
- ContactTargetInfo:
ContactId: !Ref SaburoContact
IsEssential: true
対応プラン
インシデントの対応に必要な設定をまとめたものです。
対応プランが発動すると、紐付けたエスカレーションプランが実行されます。
EmergencyResponsePlan:
Type: AWS::SSMIncidents::ResponsePlan
Properties:
Name: emergency-response-plan
DisplayName: emergency-response-plan
Engagements:
- !Ref EmergencyEscalationPlan
IncidentTemplate:
Impact: 3
Title: Emergency Occurred
アラーム
適当な CloudWatch アラームを定義します。
アラームアクションに対応プランを指定すると、アラーム発生時に対応プランが発動するようになります。
EmergencyAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: emergency-alarm
ActionsEnabled: true
AlarmActions:
- !Ref EmergencyResponsePlan
動作確認
CloudWatch アラームを発生させると対応プランが発動し、Incident Manager にインシデントが作成されます。
同時にエスカレーションが開始されます。
チャネル毎の通知例です。電話は 1
を入力、SMS と E メールはマネジメントコンソール上でコードを入力すると承認となります。
電話 | SMS | E メール |
---|---|---|
以下はアラーム発生から約10分後のタイムラインです。太郎→次郎→三郎の順に5分間隔でエスカレーションされていることが確認できます。
おわりに
Incident Manager でインシデント発生時のエスカレーション自動化を試してみた件について紹介しました。
実際に Morisawa Fonts では Incident Manager を導入し、エスカレーション自動化を行いました。
先述の通り Incident Manager にはエスカレーション自動化以外にも機能があるため、引き続きインシデント対応の強化に向けて検討を行っていきたいと思います。
-
AWS サービスの一般的なメンテナンス、デプロイ、修復タスクを自動化するためのドキュメントです。 ↩︎
Discussion