[Amazon Connect] 問い合わせフローの中で使用するLambdaのセッション情報を保持するクラスを作ってみた

ほとんどのロジックを扱えない(カウンターのインクリメントもできない)問い合わせフロー では、Lambdaの呼び出しが、必須と言えます。 今回は、Lambda側から見たセッション情報保持の仕組みを考えてみました。
2018.10.13

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側から見たセッション情報保持の仕組みは、結構使えるのでは?と思っています。