调用 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 函数位于不同的区域,则可以使用流程设计器将其添加到流程中,并使用 add-permission 命令添加资源权限,使用您的 Amazon Connect 实例的委托ARN人为connect.amazonaws.com和。有关更多信息,请参阅《AWS Lambda 开发者指南》中的将基于资源的策略用于 AWS Lambda

将 Lambda 函数添加到 Amazon Connect 实例

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

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

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

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

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

    提示

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

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

    要调用 lambda:AddPermission,您需要:

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

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

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

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

  5. 选择添加 Lambda 函数。确认该函数ARN的已添加到 Lambda 函数下。

现在,您可以在流中引用该 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 函数块中的函数输入参数。

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

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

调用重试策略

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

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

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

调用多个 Lambda 函数的最佳实践

Amazon Connect 将 Lambda 函数序列的持续时间限制为 20 秒。当总执行时间超过此阈值时,它将超时并显示错误消息。由于在 Lambda 函数运行时客户听不到声音,建议在函数之间添加播放提示数据块以在长时间交互期间保持客户的参与。

通过使用播放提示数据块分解 Lambda 函数链,您可以调用持续时间超过 20 秒阈值的多个函数。

配置 Lambda 函数以解析事件

要在您的 Lambda 函数和 Amazon Connect 之间成功传递属性和参数,请将您的函数配置为正确解析从 Invoke AWS Lambda 函数块或设置联系人属性发送的JSON请求,并定义应应用的任何业务逻辑。JSON的解析方式取决于您用于函数的运行时间。

例如,以下代码显示了如何使用 Node.JS exampleParameterKey1Invoke AWS Lambda 函数块和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,必须在流程中配置 Invoke Lambda AWS 函数块时进行设置。如果将响应验证设置为 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

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

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

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

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

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

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

使用 Lambda 函数响应

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

1. 直接访问变量

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

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

下图显示了播放提示数据块的属性页面。变量是在 text-to-speech方块中指定的。

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

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

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

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

要将返回的值存储为联系人属性并引用它们,请在流程中使用 Invoke 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. 选择 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. 选择部署

  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. 选择 T ext-to-speech 或聊天文本手动设置,然后将 “解释为” 设置为SSML。在要朗读的文本框中输入以下文本:

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

    2. 选择保存

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

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

      Please try again later.

    2. 选择保存

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

    一个 Invoke AWS Lambda 函数块。
    1. 选择 “手动选择”,然后MyFirstConnectLambda从下拉列表中进行选择。

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

    3. 选择动态设置

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

    5. 在 “属性” 中,输入companyName

    6. 选择保存

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

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

    2. 选择动态设置

    3. 命名空间 = 外部

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

    5. 选择添加其他属性

    6. 命名空间 = 用户定义

    7. 属性 = 我的URL

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

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

    10. 选择保存

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

    “播放提示”数据块。
    1. 选择 T ext-to-speech 或聊天文本,然后将 “解释为” 设置为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并选择 “保存”。

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