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.)