Amazon Connect を使って Lambda で電話をかけれるんです

記事タイトルとURLをコピーする

こんにちは、技術一課の山中です。

先日社内のメンバーから以下相談を受けました。

「山中さん、 Amazon Connect 詳しいですよね? 何かインスタンスに障害が起きたときに電話で通知するとかできるんですか?」(多分こんなかんじ 「できるんじゃないですか?」

ということで、Amazon Connect はチュートリアル以外触ったことがなかったので、実際に電話をかけれるのか検証してみました。

はじめに

何かインスタンスに障害が発生した際に、 CloudWatch 等で検知する仕組みがあれば、それをトリガーに Lambda ファンクションをキックできるので、 Lambda から Amazon Connect 経由で電話通知ができればよいと考え、 Lambda から Connect で電話することを目標としました。

Amazon Connect とは

Amazon Connect は簡単に使えるクラウド型コンタクトセンターです。 詳しくはこちらをご覧ください。 公式サイト Amazon Connect 安心して運用ができるか疑って調べてみた Amazon Connect 導入支援資料を公開しました Amazon Connectで電話をつなぐ

コールセンターサービスの立ち上げ

Amazon Connect ハンズオン初級編 を見ながら、コールセンターサービスを立ち上げます。

問い合わせフローの作成

今回以下のようなフローを作成しました。 すごくシンプルですよね。

ここでのポイントはユーザへの応答を Lambda から受け取ったメッセージとしたいので、以下のように「プロンプトの再生」で属性を指定する必要があります。

フローを作成したら、 以下のような ARN が発行されますので、 インスタンス IDコンタクトフロー ID を控えておいてください。

arn:aws:connect:ap-southeast-2:000000000000:instance/[インスタンス ID]/contact-flow/[コンタクトフロー ID]

Lambda ファンクションの作成

作成した Lambda ファンクションはこちら DestinationPhoneNumber には電話をかける電話番号を、 SourcePhoneNumber には Amazon Connect で取得した電話番号を入力します。

import boto3

ec2 = boto3.client('ec2', region_name='ap-northeast-1')
connect = boto3.client('connect')

def lambda_handler(event, context):
    running_instances = get_running_instance()
    message = '現在稼働中のインスタンスは'
    if running_instances:
        for instance_name in running_instances:
            message += instance_name

        message += 'です'
    else:
        message += 'ありません'

    call(message)


# Amazon Connect で電話をかける
def call(message):
    connect.start_outbound_voice_contact(
        DestinationPhoneNumber='+819000000000',
        ContactFlowId=[コンタクトフロー ID],
        InstanceId=[インスタンス ID],
        SourcePhoneNumber='+815000000000',
        Attributes={
            'message': message
        }
    )


# 稼働中のインスタンス一覧を取得
def get_running_instance():
    response = ec2.describe_instances(
        Filters=[
            {
                'Name': 'instance-state-name',
                'Values': [
                    'running',
                ]
            },
        ],
    )
    if not response['Reservations']:
        return []

    running_instances = []
    for reservation in response['Reservations']:
        reservation['Instances'][0]
        running_instances += [tag['Value'] for tag in reservation['Instances'][0]['Tags'] if tag['Key'] == 'Name']

    return running_instances

作成した Lambda をテスト実行すると、 Mizuki さんが東京リージョンで稼働中のインスタンスを電話でつぶやいてくれますよ! (実際に使うときはもうちょっとしっかりやります

おわりに

Lambda から電話をかけれるってすごいですよね、しかも上記の流れを作るのに本当に 1 時間くらいしかかかりませんでした。 Amazon Connect 、夢があります。