Connect と Lambda を組み合わせるときに注意すべき点いくつか

記事タイトルとURLをコピーする

こんにちは。技術4課の保田(ほだ)です。

みなさん好きな野菜は何ですか?私はピーマンが好きです。小さいころから好きで小学生の卒業制作でピーマンを擬人化したキャラクターの絵を描いたぐらい好きです。色も良いですよね。鮮やかさで言えば超新星爆発と同じぐらいだと思います。

要約

Lambda から Connect に返却できるデータ量の上限は 32 KB だから気を付けよう

あと特に返したいデータがなくても 1階層の辞書型を返そう

Connect + Lambda の組み合わせ

Amazon Connect のコンタクトフローから Lambda を呼び出して、その戻り値を再びコンタクトフロー側で使うことはよくあります。例えば読み上げ音声を動的に生成する場合などです。

Connect で Lambda を使う場合は基本的にバイブルとして参照することになるのがこのドキュメントです。

AWS Lambda 関数を呼び出す

必要なことはここをじっくり読めば書いてることが大半ですが、意外と見落としがちなのが今回の話題になります。

返却できるデータ量

返されるデータのサイズは、UTF-8 データの 32 KB 未満である必要があります。

返却できるデータ量は32KB 未満です。

手元の環境で試してみて次のような値を返すようにして見ますと、どうやら 32,500 と 33,000 の間に境界があるようです。

return {'result': 'a' * 32_000}

また、この場合のコンタクトフローのログは次のように「 Lambda がエラーを返した」と出ます。

{
    "Results": "The Lambda Function Returned An Error.",
    "ContactId": "2842f992-51fb-4a63-9fcc-3363116d4179",
    "ContactFlowId": "arn:aws:connect:ap-northeast-1:012345678901:instance/cfdf2254-4210-448b-8b90-d6817ff7107a/contact-flow/4781923c-15a4-41a7-835b-effbc9520b22",
    "ContactFlowModuleType": "InvokeExternalResource",
    "Timestamp": "2020-07-01T05:46:31.940Z",
    "Parameters": {
        "FunctionArn": "arn:aws:lambda:ap-northeast-1:012345678901:function:hoge-function",
        "TimeLimit": "3000"
    }
}

Lambda 自体はエラーを吐いていなくても、戻り値が 32KB を超えるとこのようになりますので、この制限に思い至らないと「 Lambda のログでは正常終了してるのに~~!!」となってしまいます。

動的にデータを生成してフローに返却するような構成を考えられる際は、設計段階でこの制限に達するケースがないか検討する必要がありますね。

また、返却した音声を読み上げさせたい場合も、この32KB制限とは別の制限もあります。詳細は下記のリンク先をご参照ください。

http://blog.serverworks.co.jp/tech/2020/04/08/amazon-connect-character-limit/

本文中に出てくる 状況を把握していた開発メンバーのひとり は私です。

返却できるデータ型

もう一つの注意点がこちらです。

関数から返される出力は、英数字、ダッシュ、アンダースコアのみが含まれる値を持つ、キーと値のペアのフラットオブジェクトである必要があります。ネストされた複雑なオブジェクトはサポートされません。

こちらについてはもし間違えていても単体試験の段階で気づけるのでデッケェ罠というものでもありませんが、微妙に引っかかりそうなポイントですので解説します。

読んでみると「値を返したいときはネストしていないキー・バリュー型のオブジェクトじゃないとダメだよ」という意味にも取れるので、「じゃあ別に戻り値をどうこうしたいわけじゃないから戻り値はなしでいいや」とやってしまうとアウツです(エラーが起きます)。

これ実は「必ずネストしていないキー・バリュー型のオブジェクトを返さないとダメだよ」という意味です。

Python で Lambda を書いた場合は辞書型のネストしていない変数を返すようにしましょう。フローのログで JSON ぽく見えるからとjson.dumps(result) のように JSON 文字列に変換するのも「キーと値のペアのオブジェクト」ではなくなってしまう(ただの文字列)のでダメです。

まとめ

Connect + Lambda の代表的な躓きどころについて(ほぼ)実経験をもとにご紹介しました。

有望技術の塊なのでどんどん使っていきましょう!

あとピーマン食べましょう!