AMAZON CONNECT でIVRを試してみた（その2）

# はじめに
前回は問い合わせフローだけで作ってみたが、今度はLambdaを使って
動的に音声レスポンスを変えてみることにした。
流れは、次のとおり
1. 電話かける
2. 発信元番号がS3にあるmembersファイルに合致する場合、メッセージを返す（Amazon Connect から Lambda 関数を呼び出す）
3. Lambdaから返した戻り地を音声として流す。

という簡単な流れ

## S3にファイルを作る
ファイル内容は、こんな感じのCSV

```
member_phone_number, message
09012345678,ゴールドランク
05012345678,シルバーランク
07012345678,ブロンズランク
```

## Amazon Connectから呼び出すLambda関数を作成する

```python:sample
import os
import io
import json
import csv
import urllib
import boto3

def lambda_handler(event, context):
   # バケット名
   S3_BUCKET_NAME = 'xxxxxxxxxxxxxxxxxx'
   # 会員情報のランクを書いたファイル名
   FIle_NAME = 'members.csv'
   
   # 渡されるパラメタより相手先番号を取得
   phone_number = replace_PhoneNumber(event['Details']['ContactData']['CustomerEndpoint']['Address'])

   user_message = 'あなた会員ではありません';
   # S3のファイルオブジェクトより会員電話番号と合致したものを会員ランクとして返す
   for csv_rec in csv.DictReader(get_s3file(S3_BUCKET_NAME, FIle_NAME)):
      if csv_rec['member'] == phone_number:
         user_message = csv_rec['message']

   result = {
       'Message' : user_message
   } 
   print(result['Message'])
   return result
   
# S3 から指定ファイルオブジェクトを返す
def get_s3file(bucket_name, key):
    s3 = boto3.resource('s3')
    s3obj = s3.Object(bucket_name, key).get()

    return io.TextIOWrapper(io.BytesIO(s3obj['Body'].read()))

# AMAZON CONNECT の発信元番号は、+81の国番号付きでくるから置き換え
def replace_PhoneNumber(phone_number):
   return   phone_number.replace('+81', '0')
```

この取得部分ですが、

> event['Details']['ContactData']['CustomerEndpoint']['Address']

Amazon Connect のlambda呼び出し時のパラメタは下記の形式で渡されます。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-lambda-functions.html

を参考にしていて、色々設定できそうですが、今回は試してません。

>
{
    "Details": {
        "ContactData": {
            "Attributes": {},
            "Channel": "VOICE",
            "ContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX",
            "CustomerEndpoint": {
                "Address": "+1234567890",
                "Type": "TELEPHONE_NUMBER"
            },
            "InitialContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX",
            "InitiationMethod": "INBOUND | OUTBOUND | TRANSFER | CALLBACK",
            "InstanceARN": "arn:aws:connect:aws-region:1234567890:instance/c8c0e68d-2200-4265-82c0-XXXXXXXXXX",
            "PreviousContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX",
            "Queue": {
               "ARN": "arn:aws:connect:eu-west-2:111111111111:instance/cccccccc-bbbb-dddd-eeee-ffffffffffff/queue/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
               "Name": "PasswordReset"
             },
            "SystemEndpoint": {
                "Address": "+1234567890",
                "Type": "TELEPHONE_NUMBER"
            }
        },
        "Parameters": {
            "sentAttributeKey": "sentAttributeValue"
        }
    },
    "Name": "ContactFlowEvent"
}

## Lambda 関数を問い合わせフローからの呼び出し

Amazon Connectの問い合わせフローを作成し、下記の部分を開く

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600761/4e5a485d-0068-c54b-25e8-09d81a2ca3bc.png" />

AWS Lambdaの選択から今回利用する関数を選択して、[+Add Lambda Function]をクリックしたら、Lambda関数が追加されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600761/4efd096c-6e32-c592-ecd5-1a298ccdb061.png)


## 問い合わせフロー
あとは、下記のように問い合わせフローを作って、AWSLambdaを呼び出して、関数の戻りを
次のプロンプトで再生する。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600761/2990659e-e28d-ab6c-d786-4312b5086491.png" />

Lambdaの呼び出しは、[関数を選択する]より追加したLamdba関数を選択するだけでOK

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600761/68c8b663-bb0a-da2c-ca56-666c9d8c6107.png" />

あとは、Lambdaより戻した変数をそのままプロント再生で、[$.External.変数名]で
利用できます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600761/2a7dccf4-ee85-e06c-ca2f-fae08479e098.png" />

今回は、これで電話を掛けた方の会員ランク名を音声で返します。

## まとめ
今回は、最も単純な方法で試してみました。
思った以上に簡単で、少し複雑なものが作れそうです。

Amazon Connect は、Lambdaから返した変数を属性に保存して利用します。

属性は、利用方法で定義済み属性、ユーザ定義属性、外部属性とあり、関数を呼ぶごとに上書きされるような一時的利用する外部属性と、一度、Lambdaから返した変数を保存し、使いまわし、問い合わせフローで上書きできるユーザ定義属性があります。
このあたりは、属性へのアクセス方法も含めて、マニュアル読むのが一番です。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/use-attributes-cust-exp.html