使用自动化工作流程简化 Amazon Lex 机器人的开发和部署 - AWS Prescriptive Guidance

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

使用自动化工作流程简化 Amazon Lex 机器人的开发和部署

Balaji Panneerselvam、Attila Dancso、Pavan Dusanapudi、Anand Jumnani 和 James O'Hara,Amazon Web Services

摘要

当您尝试管理多个功能、开发人员和环境时,开发和部署 Amazon Lex 对话机器人可能具有挑战性。使用基础设施即代码 (IaC) 原则的自动化工作流程可以帮助简化流程。这种模式可以通过以下方式帮助提高 Amazon Lex 开发人员的工作效率,并实现高效的机器人生命周期管理:

  • 支持多项功能的并行开发-通过自动化工作流程,开发人员可以在不同的分支中并行开发不同的功能。然后,可以在不阻碍其他工作的情况下合并和部署更改。

  • 使用 Amazon Lex 控制台用户界面 ——开发人员可以使用用户友好的 Amazon Lex 控制台来构建和测试机器人。然后在用于部署的基础设施代码中描述这些机器人。

  • 跨环境推广机器人 ——该工作流程可自动将机器人版本从开发和测试等较低环境提升到生产环境。这种方法降低了手动促销的风险和开销。

  • 维护版本控制-在 Git 中管理机器人定义,而不仅仅是通过 Amazon Lex 服务,可以为您提供版本控制和审计跟踪。与仅使用 AWS Management Console 或修改存储在中的机器人不同,更改会跟踪 APIs 到各个开发者 AWS。

通过自动化 Amazon Lex 机器人发布流程,团队可以更快地交付功能,同时降低风险和工作量。机器人仍处于版本控制之下,而不是在 Amazon Lex 控制台中被隔离。

先决条件和限制

先决条件

  • 该工作流程涉及多个 AWS 账户 不同的环境(开发、生产和 DevOps),这需要账户管理和跨账户访问配置。

  • Python 3.9 可在您的部署环境或管道中使用。

  • 在本地工作站上安装并配置 Git 以进行源代码控制。

  • AWS Command Line Interface (AWS CLI) 已安装并配置为使用命令行或 Python 进行身份验证。

限制

  • 存储库访问权限-该工作流程假设持续集成和持续交付 (CI/CD) 管道具有向源代码存储库提交更改所需的权限。

  • 初始机器人版本 — 该工具要求使用 AWS CloudFormation 模板部署机器人的初始版本。在自动工作流程接管之前,您必须创建机器人的第一个迭代并将其提交到存储库。

  • 合并冲突 — 尽管工作流程旨在实现并行开发,但在整合来自不同分支的更改时,仍有可能出现合并冲突。解决机器人配置中的冲突可能需要手动干预。

产品版本

架构

下图显示了该解决方案的高级架构和关键组件。

自动开发和部署 Amazon Lex 机器人的工作流程。

关键组件包括以下内容:

  • Lex 机器人存储库 — 一个 Git 存储库,用于存储 Amazon Lex 机器人的 IaC 定义。

  • DevOps— AWS 账户 专门为开发和部署过程提供 CI/CD 管道和相关资源。

  • Pipelin@@ es — 自动执行机器人开发和部署生命周期各个阶段的 AWS CodePipeline 实例,例如创建新机器人、导出机器人定义、导入机器人定义和删除机器人。

  • 票务机器人和主机器人 — Amazon Lex 机器人资源,其中工单机器人是由各个团队或开发人员开发的特定功能机器人,主机器人是集成了所有功能的基准机器人。

架构图说明了以下工作流程:

  1. 基准主机器人 — 工作流程的起点是在开发 (Dev) 环境中对主机器人进行基准测试。主机器人是 future 开发和新增功能的基础。

  2. 创建工单机器人 — 当需要新功能或更改时,会创建工单机器人。票务机器人本质上是主机器人的副本或分支,开发人员可以在不影响主版本的情况下使用它。

  3. 导出工单机器人-工单机器人的工作完成后,它将从 Amazon Lex 服务中导出。然后,包含票务机器人的分支将从主分支重新定位。此步骤可确保纳入票务机器人开发期间对主机器人所做的任何更改,从而减少潜在的冲突。

  4. 导入 rebased ticket bot 并验证 — 重新基准的工单机器人被导回开发环境并进行验证,以确保其在主分支的最新更改下正常运行。如果验证成功,则会创建一个拉取请求 (PR),将工单机器人更改合并到主分支中。

  5. 删除工单机器人 — 将更改成功合并到主分支后,不再需要工单机器人。可以删除工单机器人,以保持环境的清洁和可管理。

  6. 将@@ 主机器人部署到开发环境中并进行测试 — 更新后的主机器人(现在包括新功能或更改)已部署到开发环境中。在这里,它经过了全面的测试,以确保所有功能都能按预期运行。

  7. 将@@ 主机器人部署到生产环境中 — 在开发环境中完成测试并成功后,将主机器人部署到生产环境中。此步骤是工作流程的最后阶段,最终用户可以使用新功能。

自动化和扩缩

自动化工作流程允许开发人员并行处理不同的功能,每个功能都在不同的分支中。这便于并行开发,使团队能够有效地协作并更快地交付功能。由于分支彼此隔离,因此可以合并和部署更改,而不会阻塞或干扰其他正在进行的工作。

该工作流程可自动在不同环境(例如开发、测试和生产)中部署和推广机器人版本。

将机器人定义存储在 Git 等版本控制系统中可提供全面的审计跟踪并实现高效协作。对每个开发者进行变更跟踪,确保整个开发生命周期的透明度和问责制。这种方法还有助于代码审查,使团队能够在部署到生产环境之前识别和解决问题。

通过使用 AWS CodePipeline 和其他 AWS 服务,自动化工作流程可以扩展以适应不断增加的工作负载和团队规模。

工具

AWS 服务

  • AWS Cloud Development Kit (AWS CDK)是一个开源软件开发框架,用于通过使用熟悉的编程语言在代码中定义 AWS Cloud 基础架构,并通过它进行配置 AWS CloudFormation。此模式中的示例实现使用 Python。

  • AWS CDK 命令行界面 (AWS CDK CLI)- AWS CDK 工具包是与您的 AWS CDK 应用程序交互的主要工具。它执行您的应用程序,查询您定义的应用程序模型,并生成和部署 CDK 生成的 AWS CloudFormation 模板。

  • AWS CloudFormation帮助您设置 AWS 资源,快速一致地配置资源,并在和的整个 AWS 账户 生命周期中对其进行管理 AWS 区域。此模式 CloudFormation 用于使用基础设施即代码部署 Amazon Lex 机器人配置和相关资源。

  • AWS CodeBuild是一项完全托管的生成服务,可帮助您编译源代码、运行单元测试和生成可随时部署的工件。此模式 CodeBuild 用于构建和打包部署工件。

  • AWS CodePipeline帮助您快速建模和配置软件发布的不同阶段,并自动执行持续发布软件更改所需的步骤。这种模式 CodePipeline 用于协调持续交付管道。

  • AWS Command Line Interface (AWS CLI) 是一个开源工具,可帮助您AWS 服务 通过命令行 shell 中的命令进行交互。

  • AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用 AWS 资源,从而帮助您安全地管理对资源的访问权限。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

  • Amazon Lex V2 AWS 服务 用于为使用语音和文本的应用程序构建对话界面(机器人)。

  • 适用于 Python (Boto3) 的 AWS SDK是一个软件开发套件,可帮助您将 Python 应用程序、库或脚本与集成 AWS 服务。

其他工具

  • Git 是一个开源的分布式版本控制系统。

代码存储库

此模式的代码可在-ama GitHub management-framework-sample-forzon- lex 存储库中找到。代码存储库包含以下文件夹和文件:

  • prerequisite文件夹-包含用于设置所需资源和环境的 CloudFormation 堆栈定义(使用 AWS CDK)。

  • prerequisite/lexmgmtworkflow文件夹-Lex 管理工作流项目的主目录,包括堆栈定义和 Python 代码。

  • prerequisite/tests— 包含单元测试。

  • src文件夹-源代码目录,包括 Amazon Lex 机器人管理封装程序和实用工具。

  • src/dialogue_lambda— 对话钩子 Lambda 函数的源代码目录,该函数在与 Amazon Lex 机器人对话期间拦截和处理用户输入。

最佳实践

  • 将关注点分开

    • 在开发环境和生产环境之间保持明确的 DevOps责任分工。

    • AWS 账户 为每个环境单独使用以强制适当的隔离和安全边界。

    • 使用跨账户角色和最低权限访问原则,确保环境之间的访问受控。

  • 基础设施即代码

    • 定期审查和更新基础架构代码,以适应最佳实践和不断变化的需求。

    • 为源代码存储库制定明确的分支和合并策略

  • 测试和验证

    • 在管道的各个阶段实施自动测试,以便在开发周期的早期发现问题。

    • 在升级到更高的环境之前,使用 Amazon Lex 控制台或自动测试框架来验证机器人的配置和功能。

    • 考虑为部署到生产环境或关键环境实施手动批准门。

  • 监控和记录

    • 为管道、部署和机器人交互设置监控和记录机制。

    • 监控管道事件、部署状态和机器人性能指标,以便及时发现和解决问题。

    • 使用 AWS 服务(例如 Amazon CloudWatch AWS CloudTrail、和) AWS X-Ray 进行集中记录和监控。

    • 定期审查和分析自动化工作流程的性能、效率和有效性。

  • 安全与合规

    • 实施安全编码实践,并遵循 Amazon Lex 机器人开发和部署 AWS 的安全最佳实践。

    • 定期审查和更新 IAM 角色、策略和权限,使其符合最低权限原则。

    • 考虑将安全扫描和合规性检查集成到管道中。

操作说明

Task描述所需技能

设置本地 CDK 环境。

  1. 要克隆此模式的存储库并导航到该prerequisite目录,请运行以下命令:

    git clone https://github.com/aws-samples/management-framework-sample-for-amazon-lex.git cd management-framework-sample-for-amazon-lex
  2. 要安装和激活 Python 虚拟环境,请运行以下命令,将 CDK 的依赖项安装在本地项目文件夹中,而不是全局安装到项目文件夹:

    pip install virtualenv python<version> -m venv .venv source .venv/bin/activate python -m pip install -r requirements.txt
AWS DevOps

devops环境中创建跨账户角色。

devops账户负责托管和管理 CI/CD 管道。要使 CI/CD 管道能够与devprod环境交互,请运行以下命令在账户中创建跨账户角色。devops

cdk bootstrap --profile=devops cdk deploy LexMgmtDevopsRoleStack -c dev-account-id=2222222222222 -c prod-account-id=333333333333 --profile=devops
AWS DevOps

dev环境中创建跨账户角色。

dev账户中创建具有必要权限的 IAM 角色以允许该devops账户担任此角色。 CI/CD 管道使用此角色在dev账户中执行操作,例如部署和管理 Amazon Lex 机器人资源。

要创建 IAM 角色,请运行以下命令:

cdk bootstrap --profile=dev cdk deploy LexMgmtCrossaccountRoleStack -c devops-account-id=1111111111111 --profile=dev
AWS DevOps

prod环境中创建跨账户角色。

prod账户中创建具有必要权限的 IAM 角色以允许该devops账户担任此角色。 CI/CD 管道使用此角色在prod账户中执行操作,例如部署和管理 Amazon Lex 机器人资源。

cdk bootstrap --profile=prod cdk deploy LexMgmtCrossaccountRoleStack -c devops-account-id=1111111111111 --profile=prod
AWS DevOps

devops环境中创建管道。

要管理 Amazon Lex 机器人的开发工作流程,请运行以下命令在devops环境中设置管道。

cdk deploy LexMgmtWorkflowStack -c devops-account-id=1111111111111 -c dev-account-id=2222222222222 -c prod-account-id=333333333333 --profile=devops
AWS DevOps
Task描述所需技能

定义主机器人的初始版本。

要定义主机器人的初始版本,请触发BaselineBotPipeline管道。

该管道部署 CloudFormation 模板中定义的基本机器人定义,将主机器人定义导出为.json 文件。并将主机器人代码存储在版本控制系统中。

AWS DevOps
Task描述所需技能

创建票务机器人来开发和测试功能。

TicketBot是一个新的机器人实例,是从功能分支中现有的主机器人定义中导入的。这种方法可确保新机器人具有主机器人的所有当前功能和配置。

要定义工单机器人的初始版本,请触发CreateTicketBotPipeline管道。

该管道在版本控制系统中创建了一个新的功能分支,并基于主机器人创建了一个新的工单机器人实例。

Lex Bot 开发者

开发和测试票务机器人功能。

要开发和测试该功能,请登录 AWS Management Console 并打开 Amazon Lex 控制台,网址为https://console.aws.amazon.com/lex/。有关更多信息,请参阅 Amazon Lex 文档中的使用控制台测试机器人

通过该TicketBot实例,您现在可以添加、修改或扩展机器人的功能以实现新功能。例如,您可以创建或修改意图、话语、插槽和对话流。有关更多信息,请参阅 Amazon Lex 文档中的添加意图

Lex Bot 开发者

导出工单机器人定义。

导出的机器人定义本质上是以 JSON 格式表示机器人的配置和功能。

要导出工单机器人定义,请触发ExportTicketBotPipeline管道。

该管道将工单机器人定义导出为.json 文件,并将工单机器人代码存储在版本控制系统的功能分支中。

Lex Bot 开发者

从最新的主分支中重新设置功能分支。

在开发新功能的过程中,主分支可能会收到来自不同开发人员或团队的其他更改。

要将这些更改合并到功能分支中,请执行 Git rebase 操作。此操作本质上是在主分支的最新提交之上重播来自功能分支的提交,从而确保功能分支包含所有最新更改

Lex Bot 开发者

导入并验证重新设置的工单机器人。

重新设置功能分支后,必须将其导入工单机器人实例。此导入会使用重新调整的分支中的最新更改来更新现有的票务机器人。

要导入重新调整的工单机器人,请触发ImportTicketBotPipeline管道。

管道将版本控制系统功能分支中的工单机器人定义.json 文件导入到TicketBot实例中。

Lex Bot 开发者

验证重新调整后的机器人定义。

导入重新调整后的机器人定义后,验证其功能至关重要。您要确保新功能按预期运行,并且不会与现有功能冲突。

此验证通常包括使用各种输入场景测试机器人、检查响应以及验证机器人的行为是否符合预期。您可以通过以下任一方式执行验证:

  • 使用 Amazon Lex 控制台手动测试该机器人。

  • 使用测试框架和工具,使用自动化方法,这些框架和工具可以模拟用户交互并断言预期的响应。

Lex Bot 开发者

将功能分支合并到主分支中。

在隔离TicketBot实例中开发和测试新功能后,请执行以下操作:

  1. 将更改提交到版本控制系统中的相应功能分支。

  2. 要将功能分支合并到主分支,请创建拉取请求 (PR)。此 PR 用于请求审查更改并将其合并到主代码库中。

Lex Bot 开发者、仓库管理员

删除功能分支和工单机器人。

功能分支成功合并到主分支后,从源代码存储库中删除该功能分支和票务机器人。

要删除功能分支和工单机器人,请触发DeleteTicketBotPipeline管道。

该管道会删除开发过程中创建的临时机器人资源(例如,工单机器人)。此操作有助于维护干净的存储库,并防止与 future 功能分支混淆或冲突。

Lex Bot 开发者
Task描述所需技能

将最新的主机器人定义导入到dev环境中。

要将主分支中最新的主机器人定义导入到dev环境中,请触发DeployBotDevPipeline管道。

该管道还会在批准后创建 git 标签。

AWS DevOps

将最新的主机器人定义导入到prod环境中。

要将主分支中最新的机器人定义导入到prod环境中,请提供上一个任务中的标签引用作为参数并触发DeployBotProdPipeline管道。

管道将最新的机器人定义从特定标签导入到prod环境中。

AWS DevOps

故障排除

事务解决方案

当您将 Amazon Lex 机器人部署到其他账户时 AWS 账户,工具服务必须具有访问这些账户中的资源的必要权限。

要授予跨账户访问权限,请使用 IAM 角色和策略。在目标账户中创建 IAM 角色并将策略附加到授予所需权限的角色。然后,从部署 Amazon Lex 机器人的账户中扮演这些角色。

有关更多信息,请参阅 Amazon Lex 文档中的导入所需的 IAM 权限和在 Lex V2 中导出机器人所需的 IAM 权限。

相关资源