Lambda 및 Amazon Connect에서 RDS 장애 시 Slack 알림 및 전화 연락
5855 단어 AmazonConnect람다SNSRDSAWS
개요
처리 흐름

전제
설정 흐름
Connect 문의 흐름
ログ記録動作の設定 로그를보고 싶었기 때문에 활성화 音声の設定 는 적당하게(뒤에서는 Polly 사용하고 있는 것 같네요) プロンプトの再生에서 Lambda에서 호출 될 때 전달되는 텍스트를 읽도록 설정 顧客の入力を取得する에서 번호를 입력하고 해당하는 경우 1, 해당하지 않으면 2로 분기하도록 설정 問い合わせ属性の設定로 대응할지 어떨지를 변수로서 갖게한다
람다
import os
import json
import logging
import boto3
from datetime import datetime, timedelta
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# Lambdaの環境変数からConnectで取得した発信元電話番号とインスタンスIDと問い合わせフローIDを取得
SOURCE_PHONE_NUMBER = os.getenv('SOURCE_PHONE_NUMBER')
INSTANCE_ID = os.getenv('INSTANCE_ID')
CONTACT_FLOW_ID = os.getenv('CONTACT_FLOW_ID')
# Lambdaの環境変数からSlack通知用のWebHookURL取得
Slack_Webhook_URL = os.environ['SLACK_WEBHOOK_URL']
# Lambdaの環境変数から電話を掛ける相手の番号と名前を取得
destination_phone_number = [os.getenv('DESTINATION_NUMBER_1'),os.getenv('DESTINATION_NUMBER_2'),os.getenv('DESTINATION_NUMBER_3')]
person_name = [os.getenv('NAME_1'),os.getenv('NAME_2'),os.getenv('NAME_3')]
def lambda_handler(event, context):
# SNSから取得されるRDSイベントの内容
rds_event_message = json.loads(event['Records'][0]['Sns']['Message'])
# RDSイベントのメッセージをセット
target = (rds_event_message["Source ID"])
event_message = (rds_event_message["Event Message"])
tel_message = "データベースで障害です。" + "対象のデータベースは " + target + "で、" + "障害内容は " + event_message + "です。"
# 誰も対応しないということを初期設定
isCorrespond = "false"
# ここからConnectの処理
connect = boto3.client('connect' , region_name='ap-northeast-1')
for number,name in zip(destination_phone_number,person_name):
# connectで電話を掛ける
contact = connect.start_outbound_voice_contact(
DestinationPhoneNumber=number,
ContactFlowId=CONTACT_FLOW_ID,
InstanceId=INSTANCE_ID,
SourcePhoneNumber=SOURCE_PHONE_NUMBER,
Attributes={
'message': tel_message ,
'isCorrespond': 'false' # ここはもしかしたら不要かもしれません
}
)
# 電話を掛け始めて一旦待つ
time.sleep(60)
# Connectの結果を取得
contact_id = contact['ContactId']
attributes = connect.get_contact_attributes(
InstanceId=INSTANCE_ID,
InitialContactId=contact_id)
# 対応者がいるかどうかの結果をセット
isCorrespond = attributes['Attributes']['isCorrespond']
if (isCorrespond == "true"):
# 対応者あり
slack_post_correspond("[対応者]" + name)
break;
else:
# 対応者がいない
continue;
# 全員に電話を掛けても対応者不在
if(isCorrespond == "false"):
slack_post_correspond("対応者不在")
# Slackに対応者情報投稿
def slack_post_correspond(message):
slack_message = {
'text': "*" + message + "*",
}
req = Request(Slack_Webhook_URL, json.dumps(slack_message).encode('utf-8'))
try:
response = urlopen(req)
response.read()
logger.info("Message posted to %s", Slack_Webhook_URL)
return {
'statusCode': 200
}
except HTTPError as e:
logger.error("Request failed: %d %s", e.code, e.reason)
except URLError as e:
logger.error("Server connection failed: %s", e.reason)
신경이 쓰이는 세세한 점
소감
마지막으로
Reference
이 문제에 관하여(Lambda 및 Amazon Connect에서 RDS 장애 시 Slack 알림 및 전화 연락), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kurikuri_snake/items/4bcde9052428561f555b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)