[Amazon Connect] 問い合わせフローの中で使用するLambdaのセッション情報を保持するクラスを作ってみた
1 はじめに
Amazon Connect(以下、Connect)では、問い合わせフローの中では、ユーザー定義として、データ(テキストのみ)を保持することができます。ユーザー定義は、一度設定すると、通話が切断されるまで保持されるため、セッション情報として利用可能です。
しかし、Lamndaを記述する場合、セッション情報の仕組みはありません。
たとえば、下記のように2箇所で同じファンクションを呼び出しても、Lambda側では、データの永続化はできません。(セッションデータの仕組みがありません)
今回は、このLambda側でのセッション情報の保持について検討してみました。
2 ユーザー定義の参照
例えば、下記のように、呼び出される前に、ユーザー定義(MyData:1234567890)が保存されていた場合、Lambda側では、これを参照することができます。
パラメータとして送られてくるJSONの中に、ユーザー定義が格納されていることが分かります。
{ "Details": { "ContactData": { "Attributes": { "MyData": "1234567890" }, "Channel": "VOICE", "ContactId": "9a78e6cc-3e29-45a4-8787-80789434a47e", ・・・略・・・ }, "Parameters": {} }, "Name": "ContactFlowEvent" }
このDetails.ContactData.Attributesから、ユーザー定義で設定されたデータを読み取ることができます。
exports.handler = async function (event: any) { let attributes = event.Details.ContactData.Attributes; console.log(attributes.MyData); return {}; }
しかし、このデータを書き換えたとしても、それはファンクション内だけのものであり、問い合わせフロー の ユーザー定義 を変更することはできません。
exports.handler = async function (event: any) { let attributes = event.Details.ContactData.Attributes; attributes.MyData = "00000"; return {}; }
3 ユーザー定義の変更
Lambdaの処理後に、ユーザー定義 に反映させるためには、次のように、戻り値を使用して明示的に書き戻す必要があります。
(1) 戻り値を設定する
exports.handler = async function (event: any) { let attributes = event.Details.ContactData.Attributes; attributes.MyData = "00000"; return { MyData: attributes.MyData }; }
(2) 戻り値をユーザー定義に反映する
4 セッション情報保持クラス
先の要領では、一つ一つの定義を丁寧に設定する必要があります。また、ユーザー定義及び、LambdaからConnectへの戻り値が文字列しか扱えないという制約があります。
今回は、文字列に制約されず、自由にオブジェクトを保持できる、セッション情報クラスを作成してみました。
下記の例では、Number型のcounterというデータが利用可能です。
export default class SessionData{ private _sd: any = {}; constructor(event: any) { // Connectからのパラメータでセッションデータの復元を行う if (event.Details.ContactData.Attributes.sd == undefined || event.Details.ContactData.Attributes.sd == '') { return; } this._sd = JSON.parse(event.Details.ContactData.Attributes.sd); } get counter(): number { if (this._sd.counter == undefined) { this._sd.counter = 0; } return Number(this._sd.counter); } set counter(value: number) { this._sd.counter = value; } // Connectへの戻り値の生成 createResult(attr:{}): {} { let result = { sd: JSON.stringify(this._sd) }; return Object.assign(result, attr); } }
使用方法は、次のようになります。
import SessionData from './SessionData'; exports.handler = async function (event: any) { // セッションデータ const sd = new SessionData(event); // Lambdaが呼ばれるたびに、counterはインクリメントされます console.log(sd.counter); sd.counter++; return sd.createResult({otherData:"TEST"}); }
なお、ユーザー定義への保存が必要なので、終了後、必ず、下記の設定が必要です。
送られてくるパラメータを見ると、セッション情報が保持されている様子を見ることができます。
{ "Details": { "ContactData": { "Attributes": {}, "Channel": "VOICE",
{ "Details": { "ContactData": { "Attributes": { "sd": "{\"counter\":1}" }, "Channel": "VOICE",
5 最後に
ほとんどのロジックを扱えない(カウンターのインクリメントもできない)問い合わせフロー では、Lambdaの呼び出しが、必須と言えます。
そんな中、Lambda側から見たセッション情報保持の仕組みは、結構使えるのでは?と思っています。