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

コメントは受け付けていません。