【前回】AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築④〉)
【次回】AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築⑥〉)
【簡易版】AmazonConnectによる自動電話通知(まとめ)
監視サーバーで障害を検知した際に、自動で電話通知できるようにしていきます。ネットワークエンジニアも利用することの多い監視サーバー(Zabbix)で障害検知し、AWS上のAmazonConnectを利用し自動電話を発信します。
今回は下記の条件を満たせるようにAWSの各サービスを利用して自動電話通知の仕組みを導入します。
- 複数の通知先を登録した連絡先リストを持たせる。
- 連絡先リストに優先度(通知順)を設定する。
- 優先度が高い人に最初に電話する。
- 応答が無かった場合、次の優先度の人に順番に電話する。
- 連絡先リストの最後まで電話しても応答が無かった場合、最初に戻って継続する。
自動電話通知フロー
電話に応答した場合のフロー
![電話に応答した場合のフロー](https://infrastructure-engineer.com/wp-content/uploads/2021/10/001-12-1024x524.jpg)
- EC2上の監視サーバーで障害を検知し、S3へトリガーファイルを格納
- S3のイベント通知機能で、SQS_1にメッセージを送信
- SQS_1をトリガーとして、Lambda_1を起動
- Lambda_1がDynamoDB_1から連絡先を取得し、AmazonConnectを起動
- Lambda_1がAmazonConnectを起動すると同時に、SQS_2へメッセージを送信
- AmazonConnectがユーザーへ自動電話通知を実施
- ユーザが正常応答し、AmazonConnectがLambda_2を起動
- Lambda_2が応答結果をDynamoDB_2に保存(応答OK)
- 60秒後にSQS_2をトリガーとしてLambda_3を起動
- Lambda_3がDynamoDB_2の応答結果を確認(正常応答しているため、何もせずに処理完了)
電話に応答しなかった場合のフロー
![電話に応答しなかった場合のフロー](https://infrastructure-engineer.com/wp-content/uploads/2021/10/002-13-1024x524.jpg)
- EC2上の監視サーバーで障害を検知し、S3へトリガーファイルを格納
- S3のイベント通知機能で、SQS_1にメッセージを送信
- SQS_1をトリガーとして、Lambda_1を起動
- Lambda_1がDynamoDB_1から連絡先を取得し、AmazonConnectを起動
- Lambda_1がAmazonConnectを起動すると同時に、SQS_2へメッセージを送信
- AmazonConnectがユーザーへ自動電話通知を実施
- ユーザが正常応答せず、AmazonConnectがLambda_2を起動
- Lambda_2が応答結果をDynamoDB_2に保存(応答NG ※実際にはステータスを変更しない)
- 60秒後にSQS_2をトリガーとしてLambda_3を起動
- Lambda_3がDynamoDB_2の応答結果を確認
- 正常応答していないため、再度AmazonConnectを起動(以降、5から繰り返し)
DynamoDB_2を作成(通知結果を保存するDB)
DynamoDBの「テーブルの作成」をクリックします。
![DynamoDB_2の作成開始](https://infrastructure-engineer.com/wp-content/uploads/2021/11/071-1024x549.jpg)
下記の通り入力し、「テーブルの作成」をクリックします。
テーブル名::任意の名前を入力 ※ここでは、”amazonconnect-response-status”としています。
パーティションキー:「No」と入力し、「数値」を選択
ソートキー:「Name」と入力し、「文字列」を選択
![DynamoDB_2の作成](https://infrastructure-engineer.com/wp-content/uploads/2021/11/072-scaled.jpg)
テーブルが作成されたことを確認し、テーブル名をクリックします。
![DynamoDB_2の作成確認](https://infrastructure-engineer.com/wp-content/uploads/2021/11/073-1024x571.jpg)
「項目を表示」をクリックします。
![DynamoDB_2の項目表示](https://infrastructure-engineer.com/wp-content/uploads/2021/11/074-1024x571.jpg)
「項目の作成」をクリックします。
![DynamoDB_2の項目作成開始](https://infrastructure-engineer.com/wp-content/uploads/2021/11/075-1024x571.jpg)
Noの値は「1」を、Nameの値は「Response」を入力します。
![DynamoDB_2の項目作成](https://infrastructure-engineer.com/wp-content/uploads/2021/11/076-1024x571.jpg)
「新しい属性の追加」から「文字列」を追加します。
![DynamoDB_2の項目作成](https://infrastructure-engineer.com/wp-content/uploads/2021/11/077-1024x571.jpg)
属性名に「CallStatus」と入力し、値に「NG」を入力します。入力が完了したら、「項目の作成」をクリックします。
![DynamoDB_2の項目作成](https://infrastructure-engineer.com/wp-content/uploads/2021/11/078-1024x571.jpg)
項目が追加されたことを確認します。
![DynamoDB_2の項目作成確認](https://infrastructure-engineer.com/wp-content/uploads/2021/11/079-1024x571.jpg)
Lambda_2を作成(AmazonConnectの通知結果を保存する関数)
関数の作成
Lambdaの「関数の作成」をクリックします。
![Lambda関数の作成開始](https://infrastructure-engineer.com/wp-content/uploads/2021/10/002-8-1024x502.jpg)
下記の通り入力し、「関数の作成」をクリックします。
オプション:一から作成を選択
関数名:任意の名前を入力 ※ここでは、”amazonconnect-status-save”としています。
ランタイム:Pythonを選択 ※ここでは、最新版の”Python 3.9″を選択しています。
![関数の作成](https://infrastructure-engineer.com/wp-content/uploads/2021/11/080-1024x738.jpg)
関数が作成されたことを確認します。
![関数作成確認](https://infrastructure-engineer.com/wp-content/uploads/2021/11/081-1024x571.jpg)
アクセス権の追加(ロールの設定)
作成された関数の設定タブに移動し、実行ロールをクリックします。
![アクセス権の追加](https://infrastructure-engineer.com/wp-content/uploads/2021/11/082-1-1024x572.jpg)
「ポリシーをアタッチします」をクリックします。
![ポリシーのアタッチ開始](https://infrastructure-engineer.com/wp-content/uploads/2021/11/083-1024x571.jpg)
“dynamo”で検索し、「AmazonDynamoDBFullAccess」にチェックを入れ、「ポリシーのアタッチ」をクリックします。
![ポリシーのアタッチ](https://infrastructure-engineer.com/wp-content/uploads/2021/11/084-1024x571.jpg)
ポリシーがアタッチされたことを確認します。
![ポリシーのアタッチ確認](https://infrastructure-engineer.com/wp-content/uploads/2021/11/085-1024x571.jpg)
コードの記述
Lambdaのコードを記述します。
import boto3
import json
from boto3.dynamodb.conditions import Key, Attr
# boto3からDynamoDBへアクセスするためのオブジェクトを取得
dynamodb = boto3.resource('dynamodb')
# "amazonconnect-response-status"へアクセスするためのオブジェクトを取得
responsestatus = dynamodb.Table("amazonconnect-response-status")
# CallStatusを"OK"に変更する関数
def status_ok():
response = responsestatus.update_item(
Key={
'No': 1,
'Name': "Response"
},
UpdateExpression="set CallStatus=:c",
ExpressionAttributeValues={
':c': "OK"
},
ReturnValues="UPDATED_NEW"
)
return response
def lambda_handler(event, context):
# CallStatusを"OK"に変更
status_ok()
return {
'statusCode': 200
}
![コードの記述](https://infrastructure-engineer.com/wp-content/uploads/2021/11/086-1024x631.jpg)
Lambda_2のテスト
「Test」をクリックします。
![Lambda_2のテスト](https://infrastructure-engineer.com/wp-content/uploads/2021/11/086-2-1024x633.jpg)
テストイベントの設定画面で下記の通り入力し、「作成」をクリックします。
・新しいテストイベントの作成を選択
・イベント名に任意の名前を入力
・引数は不要のため”{}”を入力
![テストイベントの設定](https://infrastructure-engineer.com/wp-content/uploads/2021/11/087-1-912x1024.jpg)
もう一度、「Test」をクリックします。
![Lambda_2のテスト](https://infrastructure-engineer.com/wp-content/uploads/2021/11/086-2-1024x633.jpg)
DynamoDB_2のCallStatusが「OK」となれば成功です。
![DynamoDBのステータス変更確認](https://infrastructure-engineer.com/wp-content/uploads/2021/11/087-1024x571.jpg)
以上で、AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築⑤〉)の説明は完了です!
【前回】AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築④〉)
【次回】AmazonConnectによる自動電話通知(7.複数連絡先への電話通知〈構築⑥〉)
【簡易版】AmazonConnectによる自動電話通知(まとめ)