调用 AWS Lambda 函数 - Amazon Connect

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

调用 AWS Lambda 函数

Amazon Connect 可以与您自己的系统交互,并动态地采用流中的不同路径。要实现该目的,请在流中调用 AWS Lambda 函数,提取结果,并调用您自己的服务或与其他 AWS 数据存储或服务进行交互。有关更多信息,请参阅 AWS Lambda 开发人员指南

要从流中调用 Lambda 函数,请完成以下任务。

创建 Lambda 函数

使用任何运行时系统创建一个 Lambda 函数,然后配置该函数。有关更多信息,请参阅《AWS Lambda 开发人员指南》中的 Lambda 入门

如果在与联系中心相同的区域中创建 Lambda 函数,您可以使用 Amazon Connect 控制台将 Lambda 函数添加到您的实例中,如下一个任务(将 Lambda 函数添加到 Amazon Connect 实例)中所述。这会自动添加允许 Amazon Connect 调用 Lambda 函数资源的权限。否则,如果 Lambda 函数位于不同的区域中,您可以使用流设计器将其添加到流中,并使用主体为 connect.amazonaws.comadd-permission 命令和 Amazon Connect 实例 ARN 添加资源权限。有关更多信息,请参阅《AWS Lambda 开发者指南》中的将基于资源的策略用于 AWS Lambda

将 Lambda 函数添加到 Amazon Connect 实例

在您可以在流中使用 Lambda 函数之前,您需要将其添加到 Amazon Connect 实例。

将 Lambda 函数添加到您的实例
  1. 打开 Amazon Connect 控制台,网址为 https://console.aws.amazon.com/connect/

  2. 在实例页面上的实例别名列中选择您的实例名称。此实例名称显示在您用于访问 Amazon Connect 的 URL 中。

    
                        “Amazon Connect 虚拟联系中心实例”页面,实例别名。
  3. 在导航窗格中,选择

  4. AWS Lambda 部分,使用函数下拉框选择要添加到实例的函数。

    提示

    下拉列表只列出与您的实例位于同一区域的函数。如果未列出任何函数,请选择创建新 Lambda 函数,这将打开 AWS Lambda 控制台。

    要在其他区域或账户中使用 Lambda,可以在 调用 AWS Lambda 函数 中的选择函数下输入 Lambda 的 ARN。然后在该 Lambda 上设置相应的基于资源的策略,以允许流调用它。

    要调用 lambda:AddPermission,您需要:

    • 将主体设置为 connect.amazonaws.com

    • 将源账户设置为您实例所在的账户。

    • 将源 ARN 设置为您实例的 ARN。

    有关更多信息,请参阅为其他账户授予函数访问权限

  5. 选择添加 Lambda 函数。确认在 Lambda 函数下添加了函数的 ARN。

现在,您可以在流中引用该 Lambda 函数。

从流中调用 Lambda 函数

  1. 打开或创建流。

  2. 向网格中添加调用 AWS Lambda 函数数据块(在集成组中)。将分支与数据块连接起来。

  3. 选择调用 AWS Lambda 函数数据块的标题以打开属性页面。

  4. 选择函数下,从已添加到实例的函数列表中进行选择。

  5. (可选)在函数输入参数下,选择添加参数。可以指定在调用 Lambda 函数时发送到该函数的键/值对。还可以为函数指定超时值。

  6. 超时(最多 8 秒)中,指定等待 Lambda 超时的时间。在这段时间之后,联系人会沿着“错误”分支路由。

每次从流中调用 Lambda 函数时,都将传递一组与进行的联系相关的默认信息,以及在函数输入参数中为已添加的调用 AWS Lambda 函数数据块定义的任何其他属性。

以下是 Lambda 函数的 JSON 请求示例:

{ "Details": { "ContactData": { "Attributes": { "exampleAttributeKey1": "exampleAttributeValue1" }, "Channel": "VOICE", "ContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "CustomerEndpoint": { "Address": "+1234567890", "Type": "TELEPHONE_NUMBER" }, "CustomerId": "someCustomerId", "Description": "someDescription", "InitialContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX", "InitiationMethod": "INBOUND | OUTBOUND | TRANSFER | CALLBACK", "InstanceARN": "arn:aws:connect:aws-region:1234567890:instance/c8c0e68d-2200-4265-82c0-XXXXXXXXXX", "LanguageCode": "en-US", "MediaStreams": { "Customer": { "Audio": { "StreamARN": "arn:aws:kinesisvideo::eu-west-2:111111111111:stream/instance-alias-contact-ddddddd-bbbb-dddd-eeee-ffffffffffff/9999999999999", "StartTimestamp": "1571360125131", // Epoch time value "StopTimestamp": "1571360126131", "StartFragmentNumber": "100" // Numberic value for fragment number } } }, "Name": "ContactFlowEvent", "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" "OutboundCallerId": { "Address": "+12345678903", "Type": "TELEPHONE_NUMBER" } }, "References": { "key1": { "Type": "url", "Value": "urlvalue" } }, "SystemEndpoint": { "Address": "+1234567890", "Type": "TELEPHONE_NUMBER" } }, "Parameters": {"exampleParameterKey1": "exampleParameterValue1", "exampleParameterKey2": "exampleParameterValue2" } }, "Name": "ContactFlowEvent" }

请求分为两个部分:

  • 联系人数据 - 始终由 Amazon Connect 为每个联系人传递。某些参数是可选的。

    此部分可能包括之前已与联系人关联的属性,例如,在流中使用设置联系人属性数据块时。如果没有保存任何属性,此映射可能为空。

    下图显示了这些属性在设置联系人属性的属性页面中的显示位置。

    
                        “设置联系人属性”数据块的属性页面。
  • 参数 - 即在创建 Lambda 函数时专为此次呼叫定义的参数。下图显示了这些参数在调用 AWS Lambda 函数数据块的属性页面中的显示位置。

    
                        “调用 AWS Lambda 函数”数据块中的函数输入参数。

“调用 Lambda”数据块可以接收 JSON 格式的输入参数,既可以容纳原始数据类型,也可以容纳嵌套 JSON。以下是可以在“调用 Lambda”数据块中使用的 JSON 输入的示例。

{ "Name": "Jane", "Age":10, "isEnrolledInSchool": true, "hobbies": { "books":["book1", "book2"], "art":["art1", "art2"] } }

调用重试策略

如果在流中您的 Lambda 调用受到限制,将重试该请求。如果发生一般服务故障(500 错误),则也会重试。

当同步调用返回错误时,Amazon Connect 最多重试 3 次,最长 8 秒。此时,流程将沿错误分支向下进行。

要了解有关 Lambda 如何重试的更多信息,请参阅 AWS Lambda 中的错误处理和自动重试

调用多个 Lambda 函数

当 Lambda 函数执行时,客户什么都不会听到。建议在函数之间添加播放提示数据块以保持客户的参与度并注意长时间的互动。

配置 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 函数中使用。

Lambda 函数响应可以是 STRING_MAP 或 JSON,并且必须在流中配置调用 AWS Lambda 函数数据块时进行设置。如果将响应验证设置为 STRING_MAP,则 Lambda 函数应返回一个由字符串类型的键/值对组成的平面对象。如果将响应验证设置为 JSON,则 Lambda 函数可以返回任何有效的 JSON,包括嵌套的 JSON。


                调用 AWS Lambda 函数流数据块,突出显示了字符串映射或 json 的用法。

Lambda 响应最多可达 32kb。如果未能抵达 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 } return resultMap

从函数返回的输出必须是平面的键值对的对象,且值中只包括字母数字、短划线和下划线字符。返回数据的大小必须小于 UTF-8 数据的 32 KB。

以下示例显示了 Lambda 函数的 JSON 输出:

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

如果将响应验证设置为 JSON,那么 Lambda 函数甚至可以返回嵌套的 JSON,例如:

{ "Name": { "First": "John", "Last": "Doe" }, "AccountId": "a12345689", "OrderIds": ["x123", "y123"] }

您可以返回任何结果,只要它们是简单的键值对。

使用 Lambda 函数响应

可通过两种方式,在流中使用函数响应。可以直接引用从 Lambda 返回的变量,或者将从函数返回的值存储为联系人属性,然后引用存储的属性。如果使用 Lambda 函数响应的外部引用,那么引用将始终接收最近调用的函数响应。要在调用后续函数之前使用函数的响应,必须将响应存储为联系人属性,或者将响应作为参数传递给下一个函数。

1. 直接访问变量

如果直接访问变量,那么可以在流数据块中使用这些变量,但这些变量不会包含在联系记录中。要直接在流数据块中访问这些变量,请在调用 AWS Lambda 函数数据块之后添加该数据块,然后引用这些属性,如以下示例所示:

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

下图显示了播放提示数据块的属性页面。变量在文字转语音数据块中指定。


                    “播放提示”数据块的属性页面。

请确保为源属性指定的名称与从 Lambda 返回的键名称匹配。

2. 将变量存储为联系人属性

如果将变量存储为联系人属性,那么可以通过流来使用这些变量,并且这些变量将包含在联系记录中。

要将返回的值存储为联系人属性并引用它们,请在流中使用调用 AWS Lambda 函数数据块之后的设置联系人属性数据块。选择使用属性类型外部。遵循我们正在使用的示例,将目标属性设置为 MyAccountId,将属性设置为 AccountId,对 MyBalance平衡执行同样的操作。此配置如下图所示。


                    “设置联系人属性”数据块的属性页面。

添加“地址”作为源属性,并使用 returnedContactAddress 作为目标键。然后,添加 CallerType 作为源属性,并使用 returnedContactType 作为目标键,如下图所示。


                    “播放提示”数据块的属性页面。

请确保为源外部属性指定的名称与从 Lambda 返回的键名称匹配。

教程:创建 Lambda 函数并在流中调用

第 1 步:创建 Lambda 示例

  1. 登录到 AWS Management Console,然后打开 AWS Lambda 控制台,网址为:https://console.aws.amazon.com/lambda/

  2. 在 AWS Lambda 中,选择创建函数

  3. 如果尚未选择,请选择从头开始创建。在基本信息下,对于函数名称,输入 MyFirstConnectLambda。对于所有其他选项,接受默认设置。这些选项如以下 AWS Lambda 控制台的图像所示。

    
                            AWS Lambda 控制台。
  4. 选择创建函数

  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. 选择部署

  8. 选择部署后,选择测试以启动测试编辑器。

  9. 配置测试事件对话框中,选择创建新事件。在事件名称中,输入 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. 选择保存

  12. 选择测试。您应看到类似如下图所示的如下内容:

    
                            “代码源”部分,“测试”按钮。

    您的余额会有所不同。代码会生成一个随机数。

第 2 步:将您的 Lambda 添加到 Amazon Connect

  1. 转到 Amazon Connect 控制台,网址为:https://console.aws.amazon.com/connect/

  2. 选择您的 Amazon Connect 实例别名。

    
                            “Amazon Connect 虚拟联系中心实例”页面,实例别名。
  3. 在导航菜单上,选择

  4. 在 AWS Lambda 部分,使用 Lambda 函数下拉框选择 MyFirstConnectLambda

    
                            流页面,AWS Lambda 部分。
  5. 选择添加 Lambda 函数

第 3 步:创建联系流

下图是您要使用此流程中的步骤构建流的示例。它包含以下数据块:设置联系人属性播放提示调用 AWS Lambda 函数、另一个设置联系人属性数据块、另一个播放提示数据块,最后还有一个断开连接数据块。


                    调用“调用 AWS Lambda 函数”数据块的流。
  1. 登录 Amazon Connect 管理员网站,网址为 https://instance name.my.connect.aws/。

  2. 在导航菜单上,转至路由创建联系流

  3. 将一个设置联系人属性数据块拖到网格上,然后配置其属性页面,如下图所示:

    
                            “设置联系人属性”数据块。
    1. 命名空间 = 用户定义

    2. 属性 = companyName

    3. 选择手动设置 = GGG

    4. 选择保存

  4. 将一个播放提示数据块拖到网格上,然后配置其属性页面,如下图所示:

    
                            “播放提示”数据块。
    1. 选择文字转语音或聊天文本手动设置,然后将解释为设置为 SSML。在要朗读的文本框中输入以下文本:

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

    2. 选择保存

  5. 将另一个播放提示数据块拖到网格上,然后配置其属性页面,如下图所示:

    
                            “播放提示”数据块。
    1. 选择文字转语音或聊天文本手动设置,然后将解释为设置为文本。在要朗读的文本框中输入以下文本:

      Please try again later.

    2. 选择保存

  6. 将一个调用 AWS Lambda 函数数据块拖到网格上,然后配置其属性页面,如下图所示:

    
                            “调用 AWS Lambda 函数”数据块。
    1. 选择手动选择,然后从下拉列表中选择 MyFirstConnectLambda

    2. 目标密钥框中,输入companyName。(已发送到 Lambda。)

    3. 选择动态设置

    4. 命名空间中,选择用户定义

    5. 属性中,输入 companyName

    6. 选择保存

  7. 设置联系人属性数据块拖到网格上,选择添加其他属性,然后配置其属性页面,如下图所示:

    
                            “设置联系人属性”数据块。
    1. 命名空间 = 用户定义属性 = MyBalance

    2. 选择动态设置

    3. 命名空间 = 外部

    4. 属性 = customerBalance。这是来自 Lambda 的结果。

    5. 选择添加其他属性

    6. 命名空间 = 用户定义

    7. 属性 = MyURL

    8. 选择动态设置命名空间 = 外部

    9. 属性 = websiteUrl。这是来自 Lambda 的结果。

    10. 选择保存

  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. 选择保存

  9. 断开/挂断数据块拖到网格上。

  10. 连接所有数据块,使您的流看起来像本流程顶部显示的图像。

  11. 输入 MyFirstConnectFlow 作为名称,然后选择发布

  12. 在导航菜单上,转至渠道电话号码

  13. 选择您的电话号码。

  14. 选择 MyFirstConnectFlow,然后选择保存

现在试试吧。拨打号码。您应该会听到问候消息、您的余额和要访问的网站。