こんにちは。katoです。
今回はAmazon Connectで顧客入力をLambdaに連携する方法をご紹介したいと思います。
複数の顧客入力を利用する方法やLambda連携時の注意点にフォーカスして、Amazon Connectの振る舞いをご説明していきたいと思います。
概要
Amazon Connectでは顧客入力を利用して、問合せフローの分岐や自動アンケートシステムの構築といったことが可能です。
上記のようなシステムを構築する際には、顧客入力の情報を受け取り、Lambdaに連携することで目的の機能を実現していきます。
顧客入力の保存と振る舞い
Amazon Connectで顧客入力を利用する場合には、「顧客の入力を保存する」という操作フローを追加します。
このフローでアンケート内容などを指定し、顧客に対してキー入力を促すよう設定します。
顧客の入力した情報は、以下の属性として保存されます。
タイプ: System 属性: Stored customer input
この属性をLambda連携時に関数入力パラメータとして指定することで、Lambda側にて顧客入力の値を利用することが可能となります。
なお、顧客からのキー入力がないまま指定時間を経過した場合には、エラーではなく、タイムアウトとして顧客入力が保存され、フロー自体は、成功として判断されます。
単一の顧客入力を受け取り、Lambdaに連携する場合には、上記の様に設定を行うだけで、Lambdaのeventに顧客入力が受け渡されます。
複数の顧客入力を受け取り、Lambdaにまとめて値を受け渡す場合には少し注意が必要です。
下図の様に顧客入力を複数並べて、Lambda関数にStored customer inputのパラメータ指定を行った場合、Lambdaのeventに渡される情報は最後の顧客入力のみとなってしまいます。Stored customer inputの問合せ属性は上書きされて、最初の入力を参照することはできません。
複数の顧客入力を利用する場合には、顧客入力の保存後に、「問合せ属性の設定」にて別のキーとして値を保存する必要があります。
顧客入力の保存後に、別のキーとして入力情報を保存することで、Lambdaに対して複数の入力情報を受け渡すことが可能となります。
なお、Lambdaの直前に来る、最後の顧客入力に関しては、Stored customer inputの問合せ属性をそのまま使うことができるので、別キーとして保存し直す必要はありません。
問合せ属性として保存したキーはテキスト送信として「S.Attributes.key-name」を指定することでLambdaのeventに値を送信することが可能です。
Lambda連携と注意点
問い合わせフローの関数入力パラメータとしてLambdaに送信された顧客入力の情報はeventとしてLambda関数内で利用することが可能です。
ここでは、python 3.6における顧客入力の利用方法をご説明します。
Lambdaに送信されたパラメータの値は下記の様に記載することで簡単に値を取ることが可能です。
input1 = event['Details']['Parameters']['input1'] input2 = event['Details']['Parameters']['input2']
上記の値にはそれぞれ、顧客入力の値が保存されており、キー入力の数値情報が格納されます。
後は、条件分岐等で値に対応する回答内容などを設定し、dynamodbやRDS、S3等にデータを保存することで、アンケートの情報を保存することが可能となります。
Lambda連携時は必ずreturnを設定することに注意して下さい。
returnの設定を行っていなくても、Lambda関数自体は正常に動作しますが、Amazon Connect側の問い合わせフローにて、エラーのルーティング処理が行われます。
次のような問合せフローを作成し、returnを省略したLambda関数に連携した場合、再生されるプロンプトは全てerrorとなります。
サンプルコード
最後に、Amazon ConnectとLambdaを連携したアンケートシステムのサンプルコードを記載させていただきます。
性別と年齢をdynamodbに登録するのみのシンプルなものとなっております。
なお、問合せフローは下図のようになっております。
# coding: UTF-8 import boto3 import json def lambda_handler(event, context): phonnum = event['Details']['Parameters']['CustomerNumber'] input1 = event['Details']['Parameters']['input1'] input2 = event['Details']['Parameters']['input2'] if input1 == "1": input1 = "男性" elif input1 == "2": input1 = "女性" elif input1 == "3": input1 = "その他" else: input1 = "無効" if input2 == "1": input2 = "18-29" elif input2 == "2": input2 = "30-39" elif input2 == "3": input2 = "40-49" elif input2 == "4": input2 = "50-59" elif input2 == "5": input2 = "60-" elif input2 == "6": input2 = "その他" else: input2 = "無効" dynamodb = boto3.client('dynamodb') response = dynamodb.put_item( TableName="dynamodb-table-name", Item={ "PhoneNum": { "S": phonnum }, "sex": { "S": input1 }, "age": { "S": input2 } } ) return {'res': 'done'}