メールを受信して電話通知をする対応をSSM Incident Managerを使っておこなってみた。(Lambda版)

2021.07.08

こんにちは、コンサル部@大阪オフィスのTodaです。

前回、メール受信をトリガーとして電話通知をする対応をSSM Incident Managerを使って対応した記事を掲載しましたが、 EventBridgeを経由する方法以外にLambda処理を利用する方法もある事がわかりました。
今回はLambda処理を使ったバージョンをまとめています。

S3とEventBridgeを利用した方法は下記ページになります。

AWS Systems Manager Incident Managerとは?

CloudWatch Alarm や EventBridge Events から検出されたな異常状態やイベントをインシデントとして管理することができます。
インシデントの管理はAWSマネージメントコンソール上で確認する事ができ、対応状態を管理できます。
インシデント発生時の連絡方法は、メール・SMS・電話通知が可能です。

前提条件

  • SESにてメール受信ができるドメイン、設定が必要になります。
  • SES受信機能とIncident Managerはリージョンが制限されるため米国東部 (バージニア北部)を利用します。
  • 電話通知の内容は特に指定しない、気がつけばOKで今回は考えます。

やりたいこと

  • メールを受信したら、気がつくように電話を鳴らす。
  • 短時間で実現する。

処理イメージ

SESの受信機能をトリガーにLambda処理を実行、Boto3ライブラリを利用してIncident Managerに登録するようにします。

処理イメージ

試してみる

Incident Managerの設定

AWSコンソールにログインをおこない、リージョンを[米国東部 (バージニア北部)]に切り替えます。
[AWS Systems Manager] > [Incident Manager]をクリックします。
インシデントマネージャは初期セットアップ操作が必要になります。
レプリケーションセット、連絡先の設定は下記ページの「やってみた」を参照いただき登録操作をおこなってください。 今回は連絡先として「電話通知」を利用しますので設定をおこないます。

※電話通知は設定時に電話番号が正しいかの確認があります。
英語音声にて6桁の数字を入力する操作が必要になります。

対応プランの設定

レプリケーションセットと連絡先の設定が完了したら対応プランの設定をおこないます。
対応プランはEventBridgeでイベント発生時に、インシデント指定で利用します。

[AWS Systems Manager] > [Incident Manager] > [対応プラン] をクリックします。
[対応プランを作成]から新規追加をおこないます。

Incident Managerの設定

対応プランの設定ではプラン名と影響度、エンゲージメントを指定します。
エンゲージメントの設定は前の操作で設定した連絡先設定を選択します。
入力後は[対応プランの作成]をクリックします。

  • 名前 : 任意(plan-mail-phone-call など)
  • タイトル : 任意(plan-mail-phone-call など)
  • 影響 : 中
  • エンゲージメント : 先ほど設定した連絡先設定

対応プランの設定作業が完了となります。
作成後、対応プランのARNが必要になりますのでメモに残します。

Lambdaの作成

Lambda処理を利用してIncident Managerにインシデントを登録できるように処理を作ります。 [Lambda] > [関数の作成]をクリックします。 下記内容にてLambda関数を新規作成します。

  • 関数の作成: 一からの作成
  • 関数名: 任意
  • ランタイム: Python3.8

[重要!] 注意頂きたい事項
今回、Python3.8のBoto3を利用してIncident Managerに登録をおこないます。
Lambdaに標準で設定されているBoto3はIncident Managerのサービスをサポートしていないため最新ライブラリへの変更が必要です。 下記ページを参照頂き、最新のBoto3が利用できるように設定ください。

最新のBoto3をレイヤーに設定できたら、実際のプログラムを入力します。
今回のプログラムはIncident Managerに固定の内容を設定するのみとなります。
SESで受け取ったメール内容をIncident Managerに登録する場合は追加の改修が必要になります。
value項目は必須となっており、http://www.example.com を入れるようにしています。

import json
import botocore
import boto3
import datetime

def lambda_handler(event, context):
    client = boto3.client('ssm-incidents')
    
    response = client.start_incident(
        impact=3,
        relatedItems=[
            {
                'identifier': {
                    'type': 'INCIDENT',
                    'value': {
                        'url': 'http://www.example.com'
                    }
                },
                'title': 'Security Alert'
            },
        ],
        responsePlanArn='[Incident Manager 対応プランのARN入力]',
        title='Security Alert',
        triggerDetails={
            'source': 'Security Alert',
            'timestamp': datetime.datetime.now()
        }
    )

処理内ではdatetimeライブラリを利用しているため日本時間になるように環境変数にTZの指定をします。 Lambda関数の[設定] > [環境変数] > [編集]をクリックして追加します。

  • キー : AZ
  • 値 : Asia/Tokyo

Lambda関数の環境設定

LambdaからIncident Managerに情報を送る場合、アクセス権が必要になります。
Lambda関数の[設定] > [アクセス権] > [関連付けIAMロール]をクリックしてアクセス権に AWSIncidentManagerResolverAccess を付与してください。

Lambda関数のアクセス権

IAMロール設定

上記、設定が完了した段階でテストイベントにてLambda処理を実行して、Incident Managerにインシデントが追加されるか確認をします。 問題がなければSESの設定をおこないます。

SESの受信ルールセット作成

[Amazon Simple Email Service] > [Rule Sets]をクリックします。
[Create a New Roule Set]をクリックして新規ルールセット作成をおこないます。
ルールセット名は管理しやすい名称を指定します。
登録をするとルールセットのリストが表示されます。

SESの受信ルール作成

[Create Rule]をクリックして新規ルール作成をおこないます。

SESの受信ルール作成1

受信するメールアドレスの指定があり設定をします。
登録後は[Next Step]をクリックします。
※受信に利用するドメインはSESの検証が必要になります。

SESの受信ルール作成2

アクションの設定は作成したLambda処理が実行できるように設定を追加します。
下記、項目を入力して[Next Step]をクリックします。

  • Add Action : Lambda
  • Lambda function : 作成したLambda処理選択
  • Invocation type : Event
  • SNS topic : 未指定

SESの受信ルール作成

ルール名の指定と複数ルールがある場合、適用の順番を指定します。
項目を入力して[Next Step]をクリックします。

SESの受信ルール作成4

確認をおこない、ルールの登録作業が完了となります。

試してみる

SESに設定をした受信メールアドレス宛に、メールを送信してみます。
メール送信をおこなうと、1分前後でSSM Incident Managerによる電話通知が来れば設定が正常にできています。

さいごに

今回はメールを受信をトリガーにSSM Incident Managerによる電話通知を試してみました。
メールによるアラート発生時に何からの方法で電話を鳴らしたいというケースで利用できそうです。
少しでもお客様の参考になればと考えております。