目次
- 目次
- はじめに
- 前回やったことの振り返り
- 前提
- 前回の課題の解決
- FormImput(テキストボックス)以外の部品でFormにデータを送信した場合、Lambda側にどのようにデータが送られるのかの検証
- おわりに
- お知らせ
はじめに
こんにちは、クラウド事業部の菅家です。
この記事は「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/
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。