🚨

AWS Incident Manager によるインシデント発生時のエスカレーション自動化を試してみた

2023/11/22に公開

こんにちは、株式会社モリサワ システム開発部門の川村です。

AWS Incident Manager を利用して、インシデントの発生を検知し、自動的にエスカレーションする方法を試してみたので、簡単に紹介したいと思います。

Incident Manager とは?

AWS が提供するインシデント解決までの時間を短縮するための支援を行うサービスです。

https://docs.aws.amazon.com/ja_jp/incident-manager/latest/userguide/what-is-incident-manager.html

主な機能としては以下が挙げられます。

インシデント検知

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 にはエスカレーション自動化以外にも機能があるため、引き続きインシデント対応の強化に向けて検討を行っていきたいと思います。

脚注
  1. AWS サービスの一般的なメンテナンス、デプロイ、修復タスクを自動化するためのドキュメントです。 ↩︎

モリサワ Tech Blog

Discussion