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

AWS Lambda 関数を呼び出す

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

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

Lambda 関数の作成

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

コンタクトセンターと同じリージョンに 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/connect/) を開きます。

  2. [インスタンス] ページで、[インスタンスエイリアス] 列からインスタンス名を選択します。このインスタンス名は、Amazon Connect へのアクセスに使用する URL に表示されます。

  3. ナビゲーションペインで、[Flows] (フロー) を選択します。

  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 関数の呼び出し

  1. フローを開くか、作成します。

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

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

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

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

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

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

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

{ "Details": { "ContactData": { "Attributes": { "exampleAttributeKey1": "exampleAttributeValue1" }, "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": {"exampleParameterKey1": "exampleParameterValue1", "exampleParameterKey2": "exampleParameterValue2" } }, "Name": "ContactFlowEvent" }

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

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

    このセクションには、フローの [Set contact attributes] (問い合わせ属性の設定) ブロックの使用時など、以前に問い合わせに関連付けられていた属性が含まれることがあります。このマップは、保存されている属性が何もない場合は空の場合もあります。

    次の図は、これらの属性が、[問い合わせ属性の設定] のプロパティページに表示される場所を示しています。

  • パラメータ – これらは Lambda 関数を作成したときに定義されたこの呼び出しに固有のパラメータです。次の図は、これらのパラメータが、[AWS Lambda 関数の呼び出し] ブロックのプロパティページに表示される場所を示しています。

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

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

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

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

複数の Lambda 関数を呼び出す

Lambda 関数の実行中は無音になります。顧客の関心を保ち、実行が継続中であることを知らせるために、関数間に [Play prompt] (プロンプトの再生) ブロックを追加することをお勧めします。

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

Lambda 関数と Amazon Connect との間で属性とパラメータを正しく渡すために、[AWS Lambda 関数の呼び出し] ブロックまたは [問い合わせ属性の設定] から送られた JSON リクエストを正しく解析し、適用する必要があるビジネスロジックを定義するように関数を設定します。JSON がどのように解析されるかは、関数に使用するランタイムによって異なります。

例えば、次のコードは、Node.JS を使用して [AWS Lambda 関数の呼び出し] ブロックから exampleParameterKey1 にアクセスする方法、および [問い合わせ属性の設定] ブロックから exampleAttributeKey1 にアクセスする方法を示しています。

exports.handler = function(event, context, callback) { // Example: access value from parameter (Invoke AWS Lambda function) let parameter1 = event['Details']['Parameters']['exampleParameterKey1']; // Example: access value from attribute (Set contact attributes block) let attribute1 = event['Details']['ContactData']['Attributes']['exampleAttributeKey1']; // Example: access customer's phone number from default data let phone = event['Details']['ContactData']['CustomerEndpoint']['Address']; // Apply your business logic with the values // ... }

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

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

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

exports.handler = function(event, context, callback) { // Extract data from the event object let phone = event['Details']['ContactData']['CustomerEndpoint']['Address']; // Get information from your APIs let customerAccountId = getAccountIdByPhone(phone); let customerBalance = getBalanceByAccountId(customerAccountId); let resultMap = { AccountId: customerAccountId, Balance: '$' + customerBalance, } callback(null, resultMap); }

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

def lambda_handler(event, context): // Extract data from the event object phone = event['Details']['ContactData']['CustomerEndpoint']['Address'] // Get information from your APIs customerAccountId = getAccountIdByPhone(phone) customerBalance = getBalanceByAccountId(customerAccountId) resultMap = { "AccountId": customerAccountId, "Balance": '$%s' % customerBalance }

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

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

{ "AccountId": "a12345689", "Balance": "$1000" }

単純なキーと値のペアであれば、任意の結果を返すことができます。

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

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

1. 変数に直接アクセスする

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

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

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

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

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

問い合わせの属性として返された値を保存して参照するには、フローの [Invoke AWS Lambda function] (AWS Lambda 関数の呼び出し) ブロックの後の [Set contact attributes] (問い合わせ属性の設定) ブロックを使用します。[タイプ] で、[属性の使用]、[外部] の順に選択します。使用している例に従って、[送信先属性] を MyAccountId に設定し、[属性] を AccountId に設定します。その後、MyBalance と [Balance] (残高) で同じ操作を繰り返します。

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

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

チュートリアル: Lambda 関数を作成してフローで呼び出す

ステップ 1: Lambda の例を作成する

  1. AWS Management Console にサインインして AWS Lambda コンソール (https://console.aws.amazon.com/lambda/) を開きます。

  2. AWS Lambda で、[関数の作成] を選択します。

  3. まだ選択されていない場合は、[一から作成] を選択します。[基本的な情報] の [関数名] に「MyFirstConnectLambda」と入力します。その他すべてのオプションについては、デフォルト値を受け入れます。

  4. [Create function] (関数の作成) を選択します。

  5. [コードソース] ボックスの [index.js] タブで、コードエディタからテンプレートコードを削除します。

  6. 次の図に示すように、次のコードをコピーしてコードエディタに貼り付けます。

    exports.handler = async (event, context, callback) => { // Extract information const customerNumber = event.Details.ContactData.CustomerEndpoint.Address; const companyName = event.Details.Parameters.companyName; // Fetch data const balance = await fetchBalance(customerNumber, companyName); const support = await fetchSupportUrl(companyName); // Prepare result const resultMap = { customerBalance: balance, websiteUrl: support } callback(null, resultMap); } async function fetchBalance(customerPhoneNumber, companyName) { // Get data from your API Gateway or Database like DynamoDB return Math.floor(Math.random() * 1000); } async function fetchSupportUrl(companyName) { // Get data from your API Gateway or Database like DynamoDB return 'www.GGG.com/support'; }

    このコードは、customerBalance に対してランダムな結果を生成します。

  7. [Deploy‬] (デプロイ) をクリックします。

  8. [デプロイ] を選択した後、[テスト] を選択してテストエディタを起動します。

  9. [テストイベントの設定] ダイアログボックスで、[Create new event] (新しいイベントの作成) を選択します。[イベント名] で、テスト名として「ConnectMock」と入力します。

  10. [イベント 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": { "companyName": "GGG" } }, "Name": "ContactFlowEvent" }
  11. [Save] を選択します。

  12. [Test] を選択します。次の画像のような結果が表示されます。

    お客様の実際の残高は異なります。コードにより、乱数が生成されます

ステップ 2: Amazon Connect に Lambda を追加する

  1. Amazon Connect コンソール (https://console.aws.amazon.com/connect/) に移動します。

  2. Amazon Connect インスタンスエイリアスを選択します。

  3. ナビゲーションメニューで、[Flows] (フロー) を選択します。

  4. [AWS Lambda] セクションで、[Lambda 関数] ドロップダウンボックスを使用して [MyFirstConnectLambda] を選択します。

  5. [Lambda 関数の追加] を選択します。

ステップ 3: 問い合わせフローを作成する

次の図は、この手順のステップを使用して構築するフローの例です。

  1. コンタクトセンター (https://instance name.my.connect.aws/) にログインします。

  2. ナビゲーションメニューで、[Routing] (ルーティング)、[Flows] (フロー)、[Create a contact flow] (問い合わせフローを作成) の順に移動します。

  3. 問い合わせ属性の設定 ブロックをグリッド上にドラッグし、次の図に示すようにプロパティページを設定します。

    1. 送信先タイプ = ユーザー定義

    2. 送信先属性 = companyName

    3. [Use text] (テキストを使用) を選択します。 = GGG

    4. [Save] を選択します。

  4. プロンプトの再生 ブロックをグリッド上にブロックし、次の図に示すように、プロパティページを設定します。

    1. [テキスト読み上げまたはチャットテキスト]、[Set manually] (手動設定) の順に選択し、[解釈する] を [SSML] に設定します。読み上げるテキストのボックスに、次のテキストを入力します。

      Hello, thank you for calling $.Attributes.companyName inc.

    2. [Save] を選択します。

  5. 別の プロンプトの再生 ブロックをグリッド上にブロックし、次の図に示すように、プロパティページを設定します。

    1. [テキスト読み上げまたはチャットテキスト]、[Set manually] (手動設定) の順に選択し、[解釈する] を [テキスト] に設定します。読み上げるテキストのボックスに、次のテキストを入力します。

      Please try again later.

    2. [Save] を選択します。

  6. AWS Lambda 関数の呼び出し ブロックをグリッド上にブロックし、次の図に示すように、プロパティページを設定します。

    1. [Select a function] (関数を選択) で、ドロップダウンから [MyFirstConnectLambda] を選択します。

    2. [Add a parameter] (パラメータの追加) を選択します。[Function input parameters] (関数入力パラメータ) で、[属性を使用する] を選択します。

    3. [送信先のキー] で、「companyName」と入力します (これは Lambda に送信されます)。

    4. [Type] (タイプ) で、[User-defined] (ユーザー定義) を選択します。

    5. [属性] に、「companyName」と入力します。

    6. [Save] を選択します。

  7. 問い合わせ属性の設定 ブロックをグリッド上にブロックし、次の図に示すように、プロパティページを設定します。

    1. 送信先タイプ = ユーザー定義送信先属性 = MyBalance

    2. [属性の使用] を選択します。

    3. = 外部

    4. 属性 = customerBalance。これは Lambda からの結果です。

    5. [Add another attribute (他の属性を追加)] を選択します。

    6. 送信先属性 = MyURL

    7. [Use attribute (属性の使用)] を選択します。 = 外部

    8. 属性 = websiteUrl。これは Lambda からの結果です。

    9. [Save] を選択します。

  8. プロンプトの再生 ブロックをグリッド上にブロックし、次の図に示すように、プロパティページを設定します。

    1. [テキスト読み上げまたはチャットテキスト] を選択し、[解釈する] を [SSML] に設定します。ボックスに次のテキストを入力します。

      Your remaining balance is <say-as interpret-as="characters">$.Attributes.MyBalance</say-as>.

      Thank you for calling $.Attributes.companyName.

      Visit $.Attributes.MyURL for more information.

    2. [Save] を選択します。

  9. 切断/ハングアップ ブロックをグリッドにドラッグします。

  10. すべてのブロックを接続して、フローが、この手順の最上部に表示されている画像のようになるようにします。

  11. 名前として「MyFirstConnectFlow」と入力し、[公開] を選択します。

  12. ナビゲーションメニューで、[Channels] (チャネル)、[Phone Numbers] (電話番号) の順に移動します。

  13. 電話番号を選択します。

  14. [MyFirstConnectFlow]、[保存] の順に選択します。

ここで、動作を試してみます。番号を呼び出します。あいさつのメッセージ、残高、アクセスするウェブサイトが聞こえるはずです。