AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築④〉)

AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築④〉)

【前回】AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築③〉)
【次回】AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築⑤〉)
【簡易版】AmazonConnectによる自動電話通知(まとめ)

監視サーバーで障害を検知した際に、自動で電話通知できるようにしていきます。ネットワークエンジニアも利用することの多い監視サーバー(Zabbix)で障害検知し、AWS上のAmazonConnectを利用し自動電話を発信します。

今回は下記の条件を満たせるようにAWSの各サービスを利用して自動電話通知の仕組みを導入します。

前提条件
  • 複数の通知先を登録した連絡先リストを持たせる。
  • 連絡先リストに優先度(通知順)を設定する。
  • 優先度が高い人に最初に電話する。
  • 応答が無かった場合、次の優先度の人に順番に電話する。
  • 連絡先リストの最後まで電話しても応答が無かった場合、最初に戻って継続する。
目次

自動電話通知フロー

電話に応答した場合のフロー

電話に応答した場合のフロー
  1. EC2上の監視サーバーで障害を検知し、S3へトリガーファイルを格納
  2. S3のイベント通知機能で、SQS_1にメッセージを送信
  3. SQS_1をトリガーとして、Lambda_1を起動
  4. Lambda_1がDynamoDB_1から連絡先を取得し、AmazonConnectを起動
  5. Lambda_1がAmazonConnectを起動すると同時に、SQS_2へメッセージを送信
  6. AmazonConnectがユーザーへ自動電話通知を実施
  7. ユーザが正常応答し、AmazonConnectがLambda_2を起動
  8. Lambda_2が応答結果をDynamoDB_2に保存(応答OK)
  9. 60秒後にSQS_2をトリガーとしてLambda_3を起動
  10. Lambda_3がDynamoDB_2の応答結果を確認(正常応答しているため、何もせずに処理完了)

電話に応答しなかった場合のフロー

電話に応答しなかった場合のフロー
  1. EC2上の監視サーバーで障害を検知し、S3へトリガーファイルを格納
  2. S3のイベント通知機能で、SQS_1にメッセージを送信
  3. SQS_1をトリガーとして、Lambda_1を起動
  4. Lambda_1がDynamoDB_1から連絡先を取得し、AmazonConnectを起動
  5. Lambda_1がAmazonConnectを起動すると同時に、SQS_2へメッセージを送信
  6. AmazonConnectがユーザーへ自動電話通知を実施
  7. ユーザが正常応答せず、AmazonConnectがLambda_2を起動
  8. Lambda_2が応答結果をDynamoDB_2に保存(応答NG)
  9. 60秒後にSQS_2をトリガーとしてLambda_3を起動
  10. Lambda_3がDynamoDB_2の応答結果を確認
  11. 正常応答していないため、再度AmazonConnectを起動(以降、5から繰り返し)

DynamoDB_1を作成(連絡先情報を格納するDB)

AWSマネジメントコンソール上で、「dynamodb」を検索します。

dynamodbを検索

「テーブルの作成」をクリックします。

テーブル作成の開始

下記の通り入力し、「テーブルの作成」をクリックします。

テーブル名::任意の名前を入力 ※ここでは、”amazonconnect-contact-list”としています。
パーティションキー:「No」と入力し、「数値」を選択
ソートキー:「Name」と入力し、「文字列」を選択

テーブルの作成

テーブルが作成されたことを確認し、テーブル名をクリックします。

テーブルの確認

「項目を表示」をクリックします。

項目を表示

「項目の作成」をクリックします。

項目の作成開始

Noの値は「1」を、Nameの値は「User1(任意の名前)」を入力します。

NoとNameを設定

「新しい属性の追加」から「文字列」を追加します。

新しい属性を文字列で追加

属性名に「Phone」と入力し、値に電話番号を入力します。※電話番号は国番号を付けて入力(日本の090の番号の場合、+8190********)

新しい属性の属性名と値を設定

「新しい属性の追加」から「数値」を追加します。

新しい属性を数値で追加

属性名に「Priority」と入力し、値に「1」を入力します。※複数連絡先を登録するときの通知順です。
入力が完了したら、「項目の作成」をクリックします。

新しい属性の属性メイト値を設定

項目が追加されたことを確認します。

作成した項目の確認

Lambda_1を作成(AmazonConnectを初回起動するプログラム)

関数の作成

AWSマネジメントコンソール上で、「lambda」を検索します。

Lambdaの検索

「関数の作成」をクリックします。

Lambda関数の作成開始

下記の通り入力し、「関数の作成」をクリックします。

オプション:一から作成を選択
関数名:任意の名前を入力 ※ここでは、”amazonconnect-initiate”としています。
ランタイム:Pythonを選択 ※ここでは、最新版の”Python 3.9″を選択しています。

関数の作成

関数が作成されたことを確認します。

関数の作成確認

アクセス権の追加(ロールの設定)

作成された関数の設定タブに移動し、実行ロールをクリックします。

アクセス権の追加

「ポリシーをアタッチします」をクリックします。

ポリシーのアタッチ開始

“connect”で検索し、「AmazonConnect_FullAccess」にチェックを入れます。

amazonconnectを追加

“sqs”で検索し、「AmazonSQSFullAccess」にチェックを入れます。

sqsを追加

“dynamo”で検索し、「AmazonDynamoDBFullAccess」にチェックを入れ、「ポリシーのアタッチ」をクリックします。

dynamodbを追加

ポリシーがアタッチされたことを確認します。

ポリシーのアタッチ確認

トリガーの追加

「トリガーを追加」をクリックします。

トリガーの追加開始

「トリガーを選択」は、「SQS」を選択します。

SQSを選択

作成したSQS_1を選択し、「追加」をクリックします。

SQS_1を入力

トリガーが追加されていることを確認します。(設定タブ→トリガー)

トリガー追加確認

コードの記述

Lambdaのコードを記述します。

import json
import boto3
from boto3.dynamodb.conditions import Key, Attr

# boto3からDynamoDBへアクセスするためのオブジェクトを取得
dynamodb = boto3.resource('dynamodb')

# "amazonconnect-contact-list"へアクセスするためのオブジェクトを取得
contactlist = dynamodb.Table("amazonconnect-contact-list")

# "amazonconnect-contact-list"の内容を返す関数
def operation_scan():

    scanData = contactlist.scan()
    items=scanData['Items']

    return scanData["Items"]

# 指定されたプリオリティの電話番号を返す関数
def phone_get(json_contactinfo, now_priority):
    
    for line in json_contactinfo:
        if line['Priority']==now_priority:
            phone_number = line['Phone']

    return phone_number

def lambda_handler(event, context):

    # 電話番号リストを取得    
    contactinfo = operation_scan()

    # 初回のプライオリティを"1"に設定
    priority = 1

    # 指定したプラオリティの電話番号を取得
    phone_number = phone_get(contactinfo, priority)

    connect = boto3.client('connect')

    connect.start_outbound_voice_contact(
        DestinationPhoneNumber=phone_number,
        ContactFlowId='************************************',
        InstanceId='************************************',
        SourcePhoneNumber='+81**********',
    )

ContactFlowId:問い合わせフローID
InstanceId:インスタンスID
SourcePhoneNumber:発信元の電話番号
※国番号をつけて記述(日本の050の番号の場合、+8150********)

Lambda関数

Lambda_1のテスト

EC2から下記のコマンドを実施し、S3へファイルをアップロードします。※黄色アンダーライン箇所は、作成したS3バケット名を指定してください。

touch /tmp/test.txt
aws s3 cp /tmp/test.txt s3://amazonconnect-alert-notification-bucket
[ec2-user@ip-10-0-0-100 ~]$ touch /tmp/test.txt
[ec2-user@ip-10-0-0-100 ~]$ 
[ec2-user@ip-10-0-0-100 ~]$ aws s3 cp /tmp/test.txt s3://amazonconnect-alert-notification-bucket
upload: ../../tmp/test.txt to s3://amazonconnect-alert-notification-bucket/test.txt
[ec2-user@ip-10-0-0-100 ~]$ 

自動電話通知フローの1〜4までが実行され、プライオリティ”1″に指定した電話番号に着信があり、問い合わせフローで設定した音声が再生されることを確認します。

  1. EC2上の監視サーバーで障害を検知し、S3へトリガーファイルを格納
  2. S3のイベント通知機能で、SQS_1にメッセージを送信
  3. SQS_1をトリガーとして、Lambda_1を起動
  4. Lambda_1がDynamoDB_1から連絡先を取得し、AmazonConnectを起動

以上で、AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築④〉)の説明は完了です!

【前回】AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築③〉)
【次回】AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築⑤〉)
【簡易版】AmazonConnectによる自動電話通知(まとめ)

  • URLをコピーしました!
  • URLをコピーしました!
目次