はじめに
システムを運用していると、どうしても夜間に電話での呼び出しが必要になる場面があります。そのためにオペレーションセンターを利用することもあると思いますが、電話かけるだけなら、なんとかできないかなと考えてみました。
まぁPagerDutyが良いと思いますが、AWS使っているんなら、Amazon Connectでも良いんじゃないかと思ってやってみた、というわけです。
処理フロー
なんらかの形でS3にファイルをアップロードする
→S3へのPUTを検知してLambdaを起動
→LambdaがAmazon Connectを呼び出して、電話をかける
S3にファイルをアップロードするスクリプト
from datetime import datetime
import boto3
AWS_S3_BUCKET_NAME = 'myalertcall'
PUT_OBJECT_KEY_NAME = datetime.now().strftime('%Y%m%d%H%M%S')
s3 = boto3.resource('s3')
bucket = s3.Bucket(AWS_S3_BUCKET_NAME)
obj = bucket.Object(PUT_OBJECT_KEY_NAME)
body = """ これはテストアラートです。
test03
"""
response = obj.put(
Body = body.encode('utf-8'),
ContentEncoding = 'utf-8',
ContentType = 'text/plain'
)
Lambdaのスクリプト
from urllib.parse import unquote_plus
import boto3
def lambda_handler(event, context):
alert_bucket_name = event['Records'][0]['s3']['bucket']['name']
alert_object_key = unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
service_name = '適当なサービス'
connect = boto3.client('connect')
common_message = 'もうほんとやばいっち、いいよろうもん。なんとかしてっちゃ!'
message = '{}が大変ばい。{}'.format(service_name,common_message) connect.start_outbound_voice_contact(
DestinationPhoneNumber='+81xxxxxxxxxx',
ContactFlowId='yyyyyyyyyyy',
InstanceId='zzzzzzzzzzzzzz',
SourcePhoneNumber='+81wwwwwwwwww',
Attributes={ 'message': message }
)
問い合わせフロー
参考にした記事と同じフローを作りました。

まとめ
Amazon Connectが何なのか全くわかっていない状態からでも、1時間もせずに電話発信ができるようになりました。Amazonすごい。
あとは、発信先が電話を取らない場合は次の発信先にかけるとかのルールを作れるようになろうと思います。もうちょっとAmazon Connectを勉強しないと。
現状のスクリプトでもS3からオブジェクト名を取れるので、それで処理を分けたり、ファイルの中身をみて処理を変えたりとかできるとより便利そうだな〜とか考えています。
参考にしたサイト
・Amazon Connectで月4ドルで電話発信する仕組みを構築する
https://dev.classmethod.jp/articles/amazon-connect-system-alert/
2020/05/17 追記
このサイトを参考にして、電話に出ないと次の人にコールするように変えてみた。
・[Amazon Connect] 任意時間で電話の呼び出しコールを中断する方法を考えてみた
https://dev.classmethod.jp/articles/amazon-connect-stop-calling/
本当はS3にアップしたファイルの中身とかでメッセージを変えたり、発信先を変えたりすることになるのかなと思います。
import time
from urllib.parse import unquote_plus
import boto3
def lambda_handler(event, context):
contact_flow_id = 'hogehoge' # 自分の環境の値に変える
instance_id = 'fugafuga'
# alert_bucket_name = event['Records'][0]['s3']['bucket']['name']
# alert_object_key = unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
connect = boto3.client('connect')
common_message = 'とっても大変なことが起きました。もうほんとやばいです。なんとかしてください。'
message = f'{common_message}'
call_numbers=('phone01','phone02') # 通知したい電話番号
for number in call_numbers:
res = connect.start_outbound_voice_contact(
DestinationPhoneNumber=number,
ContactFlowId=contact_flow_id,
InstanceId=instance_id,
SourcePhoneNumber='発信番号',
Attributes={
'message': message,
'is_recieved': 'calling',
}
)
contact_id = res['ContactId']
time.sleep(10)
# 時間は適当に調整する
attr = connect.get_contact_attributes(
InstanceId=instance_id,
InitialContactId=contact_id
)
if attr['Attributes']['is_recieved'] == 'recieved':
break
connect.stop_contact(
InstanceId=instance_id,
ContactId=contact_id
)