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

AWS Lambda 関数を呼び出す

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

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

Lambda 関数の作成

任意のランタイムを使用して Lambda 関数を作成し、設定します。詳細については、『AWS Lambda Developer Guide』の「Lambda 関数の作成」を参照してください。

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

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

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

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

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

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

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

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

    ヒント

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

  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": "QueueName", "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 からのレスポンスへの外部参照を使用する場合は、その参照は常に、最近呼び出された関数からのレスポンスを受け取ります。後続の関数が呼び出される前に関数からのレスポンスを使用するには、レスポンスを問い合わせ属性として保存するか、次の関数にパラメータとして渡す必要があります。

変数に直接アクセスする

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

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

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

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

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

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

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

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