[Amazon Connect] 電話するLambda と ユーザが入力した番号を受け取るLambda を作ってみた

Amazon Connectで任意の番号に電話をかけ、ユーザに数字を押してもらい、その数字をLambdaで取得するという一連の流れを作ってみました。
2019.12.18

Amazon Connectで任意の番号に電話をかけ、ユーザに数字を押してもらい、その数字をLambdaで取得するという一連の流れを作ってみました。

概要図

Amazon Connectの準備

インスタンスの作成と電話番号の取得

【東京リージョン】Amazon Connectでコンタクトセンター構築はじめの一歩を参考にして、次の作成を行います。

  • Amazon Connectのインスタンス作成
  • 電話番号の取得

問い合わせフローを作成する

問い合わせフローを作成しますが、呼び出し先Lambdaの指定を含めたフローの作成はあとで行うため、この時点では適当でOKです。

問い合わせフローを作成する

問い合わせフローを作成する

任意文字列の発話(プロンプトの再生)を行うフローを作成します。

  • 音声の設定
    • 言語:日本語
    • 音声:Mizuki

音声の設定

プロンプトの再生を次のようにすることで、Lambda関数から任意の文字列を渡して発話可能になります。

  • プロンプトの再生
    • テキスト読み上げまたはチャットテキスト
    • 動的に入力
      • タイプ:ユーザー定義
      • 属性:message
      • 解釈する:テキスト

プロンプトの再生

作成後、左上で名前を入力します。

問い合わせフローの名前を入力

問い合わせフローを保存して公開する

続いて右上の「保存」と「公開」を押します。

保存と公開をする

問い合わせフローのARNを取得する

この時点で左上の「追加のフロー情報の表示」を選択します。

追加フロー情報の表示を押す

ここにARNが書かれているため、メモしておきます。

問い合わせフローのARNをメモしておく

電話番号と問い合わせフローを紐付ける

左のメニューから「電話番号」を選択し、続けてさきほど取得した電話番号を選択します。

電話番号を選択する

電話番号の編集画面で「問い合わせフロー」にさきほど保存&公開したフローを選択し、保存します。

電話番号と問い合わせフローを紐付けて保存する

Lambda関数の作成

2つのLambda関数を作成します。ここではAWS SAMを使います。

ディレクトリ構造

必要なファイルのみ記載しています。

.
├── src
│   ├── publish
│   │   └──  app.py
│   └── subscribe
│       └── app.py
└── template.yaml

AWS SAMテンプレート

次のAWS SAMテンプレートを作成します。

電話を掛けるLambdaには、Amazon Connectに対する権限を持つIAMロールを作成して付与しています。

また、次の4つの情報が必要になるため、デプロイ時のコマンドでLambdaの環境変数に指定します。

  • 相手の電話番号:DestinationPhoneNumber
  • 自分の電話番号:SourcePhoneNumber
  • インスタンスID:InstanceId
  • 問い合わせフローID:ContactFlowId

Lambdaコード

電話するLambda

src/publish/app.pyです。

ユーザが入力した番号を受け取るLambda

src/subscribe/app.pyです。statusCode: 200を返さない場合、Amazon Connect側で失敗と判断されます。

build

sam build

package

バケット名は適宜変更してください。

sam package \
    --output-template-file packaged.yaml \
    --s3-bucket cm-fujii.genki-sam-app-sample-bucket

deploy

次のパラメータが必要です。

  • 相手の電話番号:DestinationPhoneNumber
  • 自分の電話番号:SourcePhoneNumber
    • Amazon Connectで取得した電話番号です
  • インスタンスID:InstanceId
  • 問い合わせフローID:ContactFlowId

インスタンスIDと問い合わせフローIDは、問い合わせフローの画面で取得したARNに含まれています。

arn:aws:connect:ap-northeast-1:111122223333:instance/671b6be1-b3e2-4c9c-9539-896ecd56b75d/contact-flow/0c6d0dc4-437a-4863-834c-35ba0105304d
arn:aws:connect:ap-northeast-1:111122223333:instance/<インスタンスID>/contact-flow/<問い合わせフローID>

全体のコマンドは次になります。

sam deploy \
    --template-file packaged.yaml \
    --stack-name AmazonConnect-Sample-Stack \
    --capabilities CAPABILITY_NAMED_IAM \
    --no-fail-on-empty-changeset \
    --parameter-overrides \
        DestinationPhoneNumber=+819011112222 \
        SourcePhoneNumber=+818099998888 \
        InstanceId=671b6be1-b3e2-4c9c-9539-896ecd56b75d \
        ContactFlowId=0c6d0dc4-437a-4863-834c-35ba0105304d

問い合わせフローとLambdaを連携させる

AWSのAmazon Connect画面に行き、作成したインスタンスIDを選択します。

続いて左側メニューの「問い合わせフロー」を選択します。

問い合わせフローを選択する

下側にあるAWS Lambdaで先ほどデプロイしたLambda関数を選択し、「Lambda関数の追加」を選択します。

Lambda関数を追加する

問い合わせフロー更新

次のように更新します。細かい内容はお好みでどうぞ。

最終的に作る問い合わせフロー

更新後は、「保存」と「公開」を忘れず実行します。

顧客の入力を保存する

  • テキスト読み上げまたはチャットテキスト
    • テキスト:1〜9の数字を入力してください。
  • お客様の入力
    • カスタム
      • 最大桁数:1

顧客の入力を保存する

顧客の入力を保存する

AWS Lambda 関数を呼び出す

  • 関数を選択する
    • 先ほど追加したLambda関数
  • 関数入力パラメータ
    • 属性を使用する
      • 宛先キー:SelectedNumber
      • タイプ:システム
      • 属性:保存済みのお客様の入力

Lambda関数を呼び出す

Lambda関数を呼び出す

動作確認

発信用のLambda関数(phone-publish-function)にアクセスし、適当にテスト実行します(動けばOKです)。

発話用Lambdaをテスト実行する

すぐに電話がかかってきて、任意の番号(今回は7)を入力し、電話が切れます。

受け取る用のLambda関数(phone-subscribe-function)でログ出力したeventは下記となっており、無事に「ユーザが入力した番号(SelectedNumber)」を受け取れました!!!

{
    "Details": {
        "ContactData": {
            "Attributes": {
                "message": "これはテストメッセージです。"
            },
            "Channel": "VOICE",
            "ContactId": "2b449fc6-e1a9-4eeb-900f-a87c3a2fd9f0",
            "CustomerEndpoint": {
                "Address": "+819011112222",
                "Type": "TELEPHONE_NUMBER"
            },
            "InitialContactId": "2b449fc6-e1a9-4eeb-900f-a87c3a2fd9f0",
            "InitiationMethod": "API",
            "InstanceARN": "arn:aws:connect:ap-northeast-1:111122223333:instance/671b6be1-b3e2-4c9c-9539-896ecd56b75d",
            "MediaStreams": {
                "Customer": {
                    "Audio": null
                }
            },
            "PreviousContactId": "2b449fc6-e1a9-4eeb-900f-a87c3a2fd9f0",
            "Queue": null,
            "SystemEndpoint": {
                "Address": "+818099998888",
                "Type": "TELEPHONE_NUMBER"
            }
        },
        "Parameters": {
            "SelectedNumber": "7"
        }
    },
    "Name": "ContactFlowEvent"
}

さいごに

思っていたよりも簡単に実現できました。これは便利ですね!

参考