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

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

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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AmazonConnectSample
Parameters:
DestinationPhoneNumber:
Type: String
SourcePhoneNumber:
Type: String
InstanceId:
Type: String
ContactFlowId:
Type: String
Globals:
Function:
Timeout: 5
Resources:
PhonePublishFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: phone-publish-function
CodeUri: src/publish
Handler: app.lambda_handler
Runtime: python3.7
Environment:
Variables:
DESTINATION_PHONE_NUMBER:
Ref: DestinationPhoneNumber
SOURCE_PHONE_NUMBER:
Ref: SourcePhoneNumber
INSTANCE_ID:
Ref: InstanceId
CONTACT_FLOW_ID:
Ref: ContactFlowId
Role: !GetAtt PhonePublishFunctionRole.Arn
PhonePublishFunctionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action:
- sts:AssumeRole
Path: /
Policies:
- PolicyName: phone-publish-function-role
PolicyDocument:
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: '*'
- Effect: Allow
Action:
- connect:StartOutboundVoiceContact
- connect:StopContact
Resource: '*'
PhoneSubscribeFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: phone-subscribe-function
CodeUri: src/subscribe
Handler: app.lambda_handler
Runtime: python3.7
view raw template.yaml hosted with ❤ by GitHub

Lambdaコード

電話するLambda

src/publish/app.pyです。

import boto3
import os
import json
DESTINATION_PHONE_NUMBER = os.getenv('DESTINATION_PHONE_NUMBER')
SOURCE_PHONE_NUMBER = os.getenv('SOURCE_PHONE_NUMBER')
INSTANCE_ID = os.getenv('INSTANCE_ID')
CONTACT_FLOW_ID = os.getenv('CONTACT_FLOW_ID')
connect = boto3.client('connect')
def lambda_handler(event, context):
connect.start_outbound_voice_contact(
DestinationPhoneNumber=DESTINATION_PHONE_NUMBER,
ContactFlowId=CONTACT_FLOW_ID,
InstanceId=INSTANCE_ID,
SourcePhoneNumber=SOURCE_PHONE_NUMBER,
Attributes={
'message': 'これはテストメッセージです。'
}
)
view raw publish.py hosted with ❤ by GitHub

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

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

import json
def lambda_handler(event, context):
print(json.dumps(event))
return {
'statusCode': 200
}
view raw subscribe.py hosted with ❤ by GitHub

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"
}

さいごに

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

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.