AWS Lambda 関数を呼び出す - Amazon Connect

AWS Lambda 関数を呼び出す

Amazon Connect は独自のシステムと連携して、問い合わせフロー内のさまざまなパスを動的に使用することができます。これを実現するには、問い合わせフローで AWS Lambda 関数を呼び出して、結果を取得し、お客様独自のサービスを呼び出すか、他の AWS データストアまたはサービスと連携します。詳細については、「AWS Lambda デベロッパーガイド」を参照してください。

問い合わせフローから Lambda 関数を呼び出すには、以下のタスクを実行します。

Lambda 関数の作成

任意のランタイムを使用して Lambda 関数を作成し、設定します。詳細については、AWS Lambda デベロッパーガイドの「Create a Lambda Function」を参照してください。

コンタクトセンターと同じリージョンに Lambda 関数を作成した場合は、次のタスク Amazon Connect インスタンスに Lambda 関数を追加する で説明するように、Amazon Connect コンソールを使用して Lambda 関数をインスタンスに追加できます。これにより、Amazon Connect が Lambda 関数を呼び出すことを許可するリソースのアクセス許可が自動的に追加されます。それ以外の場合、Lambda 関数が別のリージョンにある場合は、問い合わせフローデザイナーを使用して問い合わせフローに追加し、add-permission コマンドを使用して、connect.amazonaws.com のプリンシパルと Amazon Connect インスタンスの ARN を使用してリソースのアクセス許可を追加できます。詳細については、AWS Lambda デベロッパーガイドの「AWS Lambda のリソースベースのポリシーを使用する」を参照してください。

Amazon Connect インスタンスに Lambda 関数を追加する

Lambda 関数を問い合わせフローで使用するには、Amazon Connect インスタンスに追加する必要があります。

Lambda 関数をインスタンスに追加する

  1. Amazon Connect コンソール (https://console.aws.amazon.com/directconnect/) を開きます。

  2. [Instance alias] (インスタンスエイリアス) 列からインスタンスの名前を選択します。

  3. ナビゲーションペインで、[問い合わせフロー] を選択します。

  4. [AWS Lambda] セクションの [関数] ドロップダウンボックスを使用して、インスタンスに追加する関数を選択します。

    ヒント

    このドロップダウンには、インスタンスと同じリージョンにある関数のみが表示されます。関数が表示されない場合は、[新しい Lambda 関数の作成] を選択して AWS Lambda コンソールを開きます。

    別のリージョンまたはアカウントで Lambda を使用するには、AWS Lambda 関数の呼び出し の [関数の選択] の下で、Lambda の ARN を入力します。次に、その Lambda に対応するリソースベースのポリシーを設定し、問い合わせフローがそれを呼び出すことを許可します。

    lambda:AddPermission を呼び出すには、以下のことが必要です。

    • プリンシパルを [connect.amazonaws.com] に設定します。

    • ソースアカウントを、インスタンスが置かれているアカウントに設定します。

    • ソース ARN をインスタンスの ARN に設定します。

    詳細については、「他のアカウントへのアクセス権を関数に付与する」を参照してください。

  5. [Lambda 関数の追加] を選択します。関数の ARN が [Lambda Functions (Lambda 関数)] の下に追加されていることを確認します。

これで、問い合わせフローでその Lambda 関数を参照できるようになります。

問い合わせフローからの Lambda 関数の呼び出し

Lambda 関数を呼び出す問い合わせフローを表示するには、「Lambda 統合のサンプル」を参照してください。

  1. 問い合わせフローを開くか、作成します。

  2. (統合グループの中の) AWS Lambda 関数の呼び出し ブロックをグリッドに追加します。ブロックと分岐を結合します。

  3. [AWS Lambda 関数の呼び出し] ブロックのタイトルを選択して、プロパティページを開きます。

  4. [関数の選択] で、関数のリストからインスタンスに追加した関数を選択します。

  5. (任意) [関数入力パラメータ] で、[パラメータを追加する] を選択します。Lambda 関数を呼び出すときにその関数に渡すキーと値のペアを指定できます。関数の [タイムアウト] の値を指定することもできます。

  6. [タイムアウト (最大 8 秒)] で、Lambda がタイムアウトするまで待機する時間を指定します。この後、問い合わせはエラーブランチにルーティングされます。

問い合わせフローからの Lambda 関数の呼び出しごとに、進行中の問い合わせに関連するデフォルトの情報セットと、[関数入力パラメータ] セクションに定義されている追加の属性を、追加された [AWS Lambda 関数の呼び出し] ブロックに渡します。

Lambda 関数への JSON リクエストの例を次に示します。

{ "Details": { "ContactData": { "Attributes": {}, "Channel": "VOICE", "ContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "CustomerEndpoint": { "Address": "+1234567890", "Type": "TELEPHONE_NUMBER" }, "InitialContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "InitiationMethod": "INBOUND | OUTBOUND | TRANSFER | CALLBACK", "InstanceARN": "arn:aws:connect:aws-region:1234567890:instance/c8c0e68d-2200-4265-82c0-XXXXXXXXXX", "PreviousContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "Queue": { "ARN": "arn:aws:connect:eu-west-2:111111111111:instance/cccccccc-bbbb-dddd-eeee-ffffffffffff/queue/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "Name": "PasswordReset" }, "SystemEndpoint": { "Address": "+1234567890", "Type": "TELEPHONE_NUMBER" } }, "Parameters": { "sentAttributeKey": "sentAttributeValue" } }, "Name": "ContactFlowEvent" }

このリクエストは次の 3 つのパートに分かれています。

  • 問い合わせデータ – 問い合わせのたびに、Amazon Connect によって必ず渡されます。一部のパラメータは省略可能です。

  • ユーザー属性 – これらは、問い合わせフローの [問い合わせ属性の設定] ブロックの使用時など、以前に問い合わせに関連付けられていた属性です。このマップは、保存されている属性が何もない場合は空の場合もあります。

  • パラメータ – これらは Lambda 関数を作成したときに定義されたこの呼び出しに固有のパラメータです。

呼び出しの再試行ポリシー

問い合わせフロー内の Lambda 呼び出しがスロットリングされた場合、リクエストは再試行されます。一般的なサービス障害 (500 エラー) が発生した場合も再試行されます。

同期呼び出しがエラーを返す場合、Amazon Connect は最大 8 秒間にわたり最大 3 回再試行します。この時点で、フローは Error ブランチを下に進みます。

Lambda 再試行の詳細については、「エラー処理と AWS Lambda での自動再試行」を参照してください。

複数の Lambda 関数を呼び出す

Amazon Connect は、Lambda 関数のシーケンスの持続期間を 20 秒に制限します。合計実行時間がこのしきい値を超えるとエラーになります。Lambda 関数の実行中は無音になるため、実行時間が長くなる場合に顧客が関心を失わないよう、関数間に [プロンプトの再生] ブロックを追加することをお勧めします。

Lambda 関数のチェーンを [プロンプトの再生] ブロックで中断すると、20 秒のしきい値よりも長い複数の関数を呼び出すことができます。

イベントを解析するよう Lambda 関数を設定する

Lambda 関数と Amazon Connect との間で属性を正しく渡すために、[AWS Lambda 関数の呼び出し] ブロックから送られた JSON リクエストを正しく解析し、適用する必要があるビジネスロジックを定義するように関数を設定します。JSON がどのように解析されるかは、関数に使用するランタイムによって異なります。例えば、次の例は、sing Node.JS を使用して sentAttributeKey にアクセスする方法を説明しています。

var receivedAttribute = event['Details']['Parameters']['sentAttributeKey'];

関数のレスポンスを検証する

Lambda 関数のレスポンスは、単純な文字列マップである必要があります。このマップは最大で 32 k です。Lambda にアクセスできない場合、関数が例外を出力した場合、レスポンスが理解不能な場合、または Lambda 関数が制限時間を超えた場合、問い合わせフローは Error ラベルへジャンプします。

Lambda 関数から返された出力をテストして、Amazon Connect に返されたときに正常に使用されることを確認します。次の例は、Node.JS でのサンプルのレスポンスを示します。

exports.handler = function(event, context, callback) { var resultMap = { Name:'CustomerName', Address:'1234 Main Road', CallerType:'Patient' } callback(null, resultMap); }

この例は、Python を使用したサンプルのレスポンスを示します。

def lambda_handler(event, context): resultMap = {"Name":"CustomerName","Address":"1234 Main Road","CallerType":"Patient"} return resultMap

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

次の例は、これらの Lambda 関数からの JSON 出力を示します。

{ "Name": "CustomerName", "Address": "1234 Main Road", "CallerType": "Patient" }

Lambda 関数のレスポンスを使用する

問い合わせフローで関数のレスポンスを使用するには 2 つの方法があります。Lambda から返される変数を直接参照するか、問い合わせ属性として関数から返される値を保存してから、保存された属性を参照することができます。Lambda 関数からのレスポンスへの外部参照を使用する場合は、その参照は常に、直近に呼び出された関数からのレスポンスを受け取ります。後続の関数が呼び出される前に関数からのレスポンスを使用するには、レスポンスを問い合わせ属性として保存するか、次の関数にパラメータとして渡す必要があります。

変数に直接アクセスする

変数に直接アクセスする場合、それらは問い合わせフローブロックで使用できますが、問い合わせレコードには含まれません。問い合わせフローブロックで直接これらの変数にアクセスするには、[AWS Lambda 関数を呼び出す] ブロックの後にブロックを追加してから、次の例に示すようにそれらの属性を参照します。

Name - $.External.Name Address - $.External.Address CallerType - $.External.CallerType

ソース属性に指定した名前が、Lambda から返されたキー名と一致することを確認します。

変数を問い合わせ属性として保存する

変数を問い合わせ属性として保存すると、問い合わせフロー全体で使用でき、問い合わせレコードに含まれるようになります。

問い合わせの属性として返された値を保存して参照するには、問い合わせフローの [AWS Lambda 関数の呼び出し] ブロックの後の [問い合わせ属性の設定] ブロックを使用します。[タイプ] には [外部] を選択します。使用している例に従って、[宛先キー] を returnedContactName に設定し、[ソース属性] を Name に設定します。

[ソース属性] としてアドレスを追加し、[送信先のキー] として returnedContactAddress を使用します。次に、[ソース属性] として CallerType を追加し、[送信先のキー] として returnedContactType を使用します。

ソース属性に指定した名前が、Lambda から返されたキー名と一致することを確認します。