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)