サブスクリプションフィルタからAmazon Connectで保守担当者に電話してみた

Lambda から Amazon Connect をキックして、電話をかけてみました
2020.08.13

こんにちは、崔です。

CloudWatch Logsに出力しているログファイルから、サブスクリプションフィルタを使用して特定の文字列がマッチした時に、LambdaからAmazon Connectをキックして保守担当者に電話をかけてみました。

構成

今回の流れは以下のとおりです。

  1. CloudWatch Logsへログ出力
  2. サブスクリプションフィルタで特定の文字列がマッチした場合、Lambda関数を起動
  3. Lambda関数からAmazon Connectを呼び出し
  4. Amazon Connect から担当者に電話

本ブログではサブスクリプションフィルタの設定は省略し、上記の3,4にあたる部分を解説します。

Amazon Connect の構築

リソース設定

まず、Amazon Connect のリソースを設定します。
マネジメントコンソールからAmazon Conncet を開きます。

次に、ID管理を行います。
「Amazon Conncet 内にユーザーを保存」 を選択し、アクセスURLを設定します。

次に、管理者を作成します。
「新しい管理者の追加」を選択し、各情報を入力します。
パスワードは8〜64文字で、大文字・小文字・数字をそれぞれ1つ以上含める必要があります。

次に、テレフォニーオプションを設定します。
今回は、「発信通話」にチェックをいれます。

次に、データストレージを設定します。
通話記録やチャット記録、レポートを保存するS3が設定できます。
今回は、デフォルトのまま設定します。
「設定カスタマイズ」をクリックすると、保存先のS3バケットや暗号化の設定を変更できます。

最後に、設定した内容を確認し、インスタンスを作成します。

セットアップが完了するのを待ちます。
完了後、「今すぐ始める」をクリックすると、Amazon Conncet にアクセスできます。

電話番号の取得

次に、電話番号を取得します。
以下の項目について、選択していきます。

  • 国/地域
  • タイプ(Direct Dial もしくは Toll Free)
  • 電話番号(いくつかの番号から、好きな番号を選択)

電話番号については、日本を選んだ場合、Direct Dial ですと「050」から、Toll Freeですと「0120」もしくは「0800」から始まる番号が選べます。

これで、電話番号の取得が完了しました。

問い合わせフローの作成

次に、Lambda関数からAmazon Connectで発信できるように問い合わせフローを作成します。

ダッシュボードのメニューから、「問い合わせフロー」を選択します。

右側の「問い合わせフローの作成」を選択します。

まず、画面左上の「名前の入力」欄に、新規フローの名前を入力します。
今回は、「alert call」とします。

次に、「設定」 - 「音声の設定」 をドラッグ&ドロップでフローに貼り付けます。

「音声の設定」をクリックし、言語と音声を選択します。
今回はこのまま、英語とします。日本語も選択可能です。

次に、「操作」 - 「プロンプトの再生」 をフローに貼り付けます。

次に、「プロンプトの再生」をクリックし、設定します。 「テキスト読み上げまたはチャットテキスト」 を選択し、次に「動的に選択する」 を選択します。
タイプに「ユーザ定義」 を選択し、属性は「message」 と定義します。
解釈するは、「テキスト」のままとします。
属性は、Lambda関数から任意のメッセージを渡すときの属性名となります。

次に、「終了/転送」 - 「切断/ハングアップ」 をフローに貼り付けます。

それぞれの設定を接続し、「公開」をクリックします。
次のダイアログも「公開」をクリックします。

これで、Lambda関数で渡された文字列を音声で通話することができるようになります。

Lambda関数の作成

では、上記で作成したAmazon Connect の問い合わせフローをキックするLambda関数をPython3.8で作成します。
下記の内容でOKです。

import boto3

def lambda_handler(event, context):
    
    connect = boto3.client('connect')

    message = 'an error occured.'
    
    connect.start_outbound_voice_contact(
        ContactFlowId='a8cb8762-ced0-42eb-9629-d642e42d08e0',
        InstanceId='0c56d871-0e28-4376-aab9-765da7861f62',
        DestinationPhoneNumber='+819012345678',
        SourcePhoneNumber='+815087654321',
        Attributes={
            'message': message
        }
    )

Boto3 の start_outbound_voice_contact を利用します。
Connect — Boto3 Docs 1.14.41 documentation

ContactFlowId は、問い合わせフローのIDです。問い合わせフローを開き、左上の「追加のフロー情報を表示」 をクリックします。
表示されるARNの「contact-flow」の次の文字列が該当します。

InstanceId は、Amazon Connect インスタンスのIDです。問い合わせフローを開き、左上の「追加のフロー情報を表示」 をクリックします。
表示されるARNの「instance」の次の文字列が該当します。

DestinationPhoneNumber は、通知先となる担当者での電話番号を設定します。
日本の国番号の81と、先頭の0(ゼロ)を除いた電話番号を設定します。

SourcePhoneNumber は、発信元となるAmazon Connect インスタンスに関連付けた電話番号を設定します。
日本の国番号の81と、先頭の0(ゼロ)を除いた電話番号を設定します。

最後に、Lambda関数のIAMロールに、AmazonConnectFullAccess のポリシーを追加します。

これで、Lambda関数からAmazon Connectを通じて、担当者にコールすることができます。
後は、サブスクリプションフィルタにこのLambda関数を設定すればOKです。

まとめ

Amazon Connect ですが、触ってみると思ったより簡単に電話で通知することができました。
Lambdaから呼び出せるので、サブスクリプションフィルタだけでなく、SNSからも発火可能ですね。
電話通知もAWSのサービスだけで完結できるので、驚きです。

参考

【東京リージョン】Amazon Connectでコンタクトセンター構築はじめの一歩 | Developers.IO
Amazon Connectで月4ドルで電話発信する仕組みを構築する | Developers.IO