APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Amazon Connect ステップバイステップガイド:フォームに入力された情報をLambdaに送信する(その2)

目次

はじめに

こんにちは、クラウド事業部の菅家です。

この記事は「Amazon Connect ステップバイステップガイド:フォームに入力された情報をLambdaに送信する(その1)」の続きになります。
techblog.ap-com.co.jp
前回、ステップバイステップガイドのフォーム画面に入力された内容をLambdaに送信する検証を行いました。

今回は以下の2つのポイントにて進めていこうと思います。
・前回の課題の解決
・FormImput(テキストボックス)以外の部品でFormにデータを送信した場合、Lambda側にどのようにデータが送られるのかの検証

前回やったことの振り返り

まず、前回検証したことを簡単に振り返ります。
前述のとおり、ステップバイステップガイドのフォーム画面に入力された内容をLambdaに送信する検証を行いました。

具体的には次のような手順を実施しました。

  • フォーム画面を作成する
      >作成のポイント:部品からFormを選択し、これをコンテナとして各部品を配置していくこと

  • Lambdaを作成する
      >Lambda関数を作成、フォームのデータはJSON形式で取得する
      >Amazon Connectのフローから呼べるように許可設定や紐づけ設定を行った

  • フローを作成する
      >フォームを表示するフローに対して「AWS Lambda関数を呼び出す」ブロックを追加し、「関数入力パラメータ」に対してフォームの情報を送信するよう設定した。

前提

前提として前回作成したフローやLambda関数を使用していきます。
ビュー


ビューの表示フロー


フロー「AWS Lambda関数を呼び出す」ブロックの「関数入力パラメータ」 設定


Lambda関数
PythonにてJSONファイルの内容全量と、特定の要素を抜き出してPrintする処理を記載。

import json

def lambda_handler(event, context):
    print('##### JSON #####')
    print(json.dumps(event))

    print('##### call #####')
    print ('event name:'+ event['Name'])
    print ('event channel:'+ event['Details']['ContactData']['Channel'])

#    print('##### Attributes #####')
#    print ('Attributes:'+ event['Details']['ContactData']['Attributes']['test'])
    
    print('##### Form #####')
    print ('Form_imput:'+ event['Details']['Parameters']['formData']['Action'])
    
    
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

前回の課題の解決

課題①作成したのはFormInput(テキストボックス)2つを持ったフォームだが、1つ分の値しか送信されていない

フォームに対してFormInput(テキストボックス)を2つ用意して、「test1」「test2」とそれぞれ値を入力して送信しましたが、「test2」の方しか値が送られていないことが分かったため、これについて見ていきます。
ゴールとして両方のFormInputの値がLambda関数に送られるようにしたいです。

事象

にフォームのビューがこちら。
1つ目のFormInput部品に「test1」の値、2つ目に「test2」の値を入れてSubmitボタンでデータを送信する流れとなっています。

そしてLambda関数に送られた値はこちら。
JSONから該当箇所を抜き出しますが、2つあるはずの値が1つしか送られていません。

"ViewResultData": "{\"input-1\":\"test2\"}"
検証・解決方法

原因を探ってみます。
Lambda関数に送られてくるJSONに「test2」の値が入っていることから、2つ目のFormInput部品の値が送られることがわかります。
わからないのがJSONの「input-1」の値がどこから来ているかというところです。

FormInput部品のプロパティに「input-1」が設定されているところがないか探してみます。

...ありました。

「Name」プロパティにて確認できました。
この値が両方のFormInput部品で同じ値となっていたために、おそらく1つしか送られなかったと予想。
「Name」プロパティの値を1つ目を「first_name」2つ目を「family_name」として設定して保存してみます。


電話をかけ、ステップバイステップガイド上からフォームを送信します。


実行されたLambda関数のログから、JSONを確認します。

        "Parameters": {
            "formData": {
                "Action": "submit",
                "ViewResultData": "{\"first_name\":\"test_name1\",\"family_name\":\"test_name_2\"}"
            }
        }

想定通り2つのFormInput部品の値を送信できました。
Lambda関数にFormの情報を送信したい場合、Nameプロパティの値は各Form部品で一意にする必要がありそうです。

課題②Formの情報をJSONに詰める時に、カスタムフォームの場合、$.Viewなどの要素の指定の方法がわからない

事象

Amazon Connectのコンタクトフローの「AWS Lambda関数を呼び出す」部品の設定で、「関数入力パラメータ>パラメータを追加」に入れる値にて、課題が残りました。
この「関数入力パラメータ」ですが、こちらに値を設定することでLambda関数にAmazon Connectのフロー内の値を送ることができます。

前回はここに「$.View」を入れることでフォームの入力値の値を送信できました。
Lambda関数側でJSONに送られた値がこんな感じ。

        "Parameters": {
            "formData": {
                "Action": "submit",
                "ViewResultData": "{\"first_name\":\"test_name1\",\"family_name\":\"test_name_2\"}"
            }
        }

値を見るとフォームデータが「{\"first_name\":\"test_name1\",\"family_name\":\"test_name_2\"}"」として入ってきているのですが、公式ドキュメントのようにフォーム部品単位に分けて表示したい。

▼こんな感じにデータが送られてきてほしい

"first_name":"test_name1"
"family_name":"test_name_2"

▼公式ドキュメント
docs.aws.amazon.com

データの構造としては「$.View.ViewResultData」っぽいのですが、これを設定するとフロー公開時にエラーとなり設定できませんでした。

検証・解決方法

「$.View.ViewResultData.<部品のNameプロパティ>」としてみます。

        "Parameters": {
            "formData": "test1"
        }

FormInput部品の1つfirst_nameの値が送信されました。
どうやらフォームに乗せた部品単位にパラメータを設定する必要がありそうです。

宛先キー(JSONに表示されるキー)が「formData」となってしまっているので名前を修正しつつ、もう1つのフォーム部品「family_name」の方もついでに送ってみます。

「関数入力パラメータ」にて、フォーム部品分だけパラメータを追加します。



フォーム部品単位で値を送信することができました。

        "Parameters": {
            "first_name": "test1",
            "family_name": "test2"
        }


FormImput(テキストボックス)以外の部品でFormにデータを送信した場合、Lambda側にどのようにデータが送られるのかの検証

最後に他のForm部品について、どのようにデータが送られてくるのかを確認します。
ビューの作成にて、Formにある部品をすべて乗せたフォームを作成します。

乗せた部品とnameプロパティの値はビューの上から以下です。部品名(nameプロパティ)

  • Form Input(first_name)

  • Form Input(family_name)

  • CheckboxGroup(checkbox1)

  • Date Picker(date_picker1)

  • Dropdown(dropdown1)

  • Radio Group(radio_group1)

  • Text Area(text_area1)

  • TimePicker(time_picker1)

  • Toggle(toggle1)

前述の課題のとおり、Amazon Connectのコンタクトフローの「AWS Lambda関数を呼び出す」部品の設定で、「関数入力パラメータ>パラメータを追加」からフォーム部品分のパラメータを追加します。

・宛先キー:任意の値(ここではNameプロパティの値としました)
・値:$.Views.ViewResultData.<Nameプロパティの値>

この設定でLambda関数を実行してみます。
各部品の値を取得することができました。

        "Parameters": {
            "first_name": "test1",
            "family_name": "test2",
            "checkbox1": {
                "0": "Default Option 1",
                "1": "Default Option 3"
            },
            "date_picker1": "2023-11-01",
            "dropdown1": {
                "0": "Option 1",
                "1": "Option 2"
            },
            "radio_group1": "Option 1",
            "text_area1": "DefaultValue Placeholder",
            "time_picker1": "12:00",
            "toggle1": "true"
        }

おわりに

前回かなり消化不良で終わってしまったため、前回分の課題が今回で解決できてホッとしました。
コンタクトフローに関数パラメータを追加するのが少し大変だったため、こちらについてもっと効率の良い方法があれば知りたいです。

お知らせ

APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。

その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
www.ap-com.co.jp

https://www.ap-com.co.jp/service/utilize-aws/

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp