将 AWS Lambda 与 Amazon Lex 结合使用 - AWS Lambda

将 AWS Lambda 与 Amazon Lex 结合使用

您可以使用 Amazon Lex 将会话自动程序集成到您的应用程序中。Amazon Lex 自动程序提供了与用户的对话界面。Amazon Lex 提供了与 Lambda 的预构建集成,这使您能够将 Lambda 函数与您的 Amazon Lex 自动程序一起使用。

配置 Amazon Lex 自动程序时,您可以指定一个 Lambda 函数来执行验证和/或履行。为了进行验证,Amazon Lex 在用户的每次响应后调用 Lambda 函数。Lambda 功能可以验证响应,并在必要时向用户提供纠正性反馈。为了进行履行,在自动程序成功收集所有必需信息并收到用户的确认后,Amazon Lex 调用 Lambda 函数来完成用户请求。

您可以对 Lambda 函数管理并发性,以控制您提供服务的同时发生的自动程序对话的最大数量。如果函数处于最大并发状态,Amazon Lex API 将返回 HTTP 429 状态代码(请求过多)。

如果 Lambda 函数引发异常,API 将返回 HTTP 424 状态代码(依赖项失败异常)。

Amazon Lex 自动程序同步调用 Lambda 函数。事件参数包含有关自动程序和对话框中每个槽的值的信息。invocationSource 参数指示 Lambda 函数是应验证输入 (DialogCodeHook) 还是履行意图 (FulfillmentCodeHook)。

例 Amazon Lex 消息事件

{ "messageVersion": "1.0", "invocationSource": "FulfillmentCodeHook", "userId": "ABCD1234", "sessionAttributes": { "key1": "value1", "key2": "value2", }, "bot": { "name": "OrderFlowers", "alias": "prod", "version": "1" }, "outputDialogMode": "Text", "currentIntent": { "name": "OrderFlowers", "slots": { "FlowerType": "lilies", "PickupDate": "2030-11-08", "PickupTime": "10:00" }, "confirmationStatus": "Confirmed" } }

Amazon Lex 预计来自 Lambda 函数的响应,格式如下。dialogAction 字段为必填项。sessionAttributesrecentIntentSummaryView 字段是可选的。

例 Amazon Lex 消息事件

{ "sessionAttributes": { "key1": "value1", "key2": "value2" ... }, "recentIntentSummaryView": [ { "intentName": "Name", "checkpointLabel": "Label", "slots": { "slot name": "value", "slot name": "value" }, "confirmationStatus": "None, Confirmed, or Denied (intent confirmation, if configured)", "dialogActionType": "ElicitIntent, ElicitSlot, ConfirmIntent, Delegate, or Close", "fulfillmentState": "Fulfilled or Failed", "slotToElicit": "Next slot to elicit } ], "dialogAction": { "type": "Close", "fulfillmentState": "Fulfilled", "message": { "contentType": "PlainText", "content": "Thanks, your pizza has been ordered." }, "responseCard": { "version": integer-value, "contentType": "application/vnd.amazonaws.card.generic", "genericAttachments": [ { "title":"card-title", "subTitle":"card-sub-title", "imageUrl":"URL of the image to be shown", "attachmentLinkUrl":"URL of the attachment to be associated with the card", "buttons":[ { "text":"button-text", "value":"Value sent to server on button click" } ] } ] } } }

请注意,dialogAction 所需的其他字段根据 type 字段的值而有所不同。有关事件和响应字段的更多信息,请参阅 Amazon Lex 开发人员指南中的 Lambda 事件和响应格式。有关演示如何将 Lambda 与 Amazon Lex 一起使用的示例教程,请参阅 Amazon Lex 开发人员指南中的练习 1:使用蓝图创建 Amazon Lex 自动程序

角色和权限

您需要将服务相关角色配置为函数的执行角色。Amazon Lex 定义具有预定义权限的服务相关角色。当您使用控制台创建 Amazon Lex 自动程序时,会自动创建服务相关角色。要使用 AWS CLI 创建服务相关角色,请使用 create-service-linked-role 命令。

$ aws iam create-service-linked-role --aws-service-name lex.amazonaws.com

此命令创建以下角色。

{ "Role": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "lex.amazonaws.com" } } ] }, "RoleName": "AWSServiceRoleForLexBots", "Path": "/aws-service-role/lex.amazonaws.com/", "Arn": "arn:aws:iam::account-id:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots" }

如果您的 Lambda 函数使用其他 AWS 服务,则需要向服务相关角色添加相应的权限。

您可以使用基于资源的权限策略来允许 Amazon Lex 意图调用您的 Lambda 函数。如果您使用 Amazon Lex 控制台,将自动创建权限策略。从 AWS CLI 中,使用 Lambda add-permission 命令设置权限。以下示例设置 OrderFlowers 意图的权限。

aws lambda add-permission \ --function-name OrderFlowersCodeHook \ --statement-id LexGettingStarted-OrderFlowersBot \ --action lambda:InvokeFunction \ --principal lex.amazonaws.com \ --source-arn "arn:aws:lex:us-east-1:123456789012 ID:intent:OrderFlowers:*"