

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

# 使用自动化工作流简化 Amazon Lex 机器人的开发和部署
<a name="streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow"></a>

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

## Summary
<a name="streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow-summary"></a>

当需要管理多个功能、开发人员及环境时，开发和部署 Amazon Lex 对话式机器人可能会面临挑战。使用基础设施即代码（IaC）原则的自动化工作流程有助于简化这一流程。此模式可通过以下方式提升 Amazon Lex 开发人员的工作效率，并实现高效的机器人生命周期管理：
+ **支持多项功能的并行开发** - 借助自动化工作流，开发人员可在独立分支中并行开发不同的功能。后续可合并变更并部署，且不会阻碍其他工作的推进。
+ **使用 Amazon Lex 控制台 UI** - 开发人员可使用用户友好的 Amazon Lex 控制台来构建和测试机器人，随后通过基础设施代码定义机器人以完成部署。
+ **跨环境推广机器人** - 该工作流可自动将机器人版本从开发、测试等较低级别的环境推广至生产环境。这种方法降低了手动推广的风险和开销。
+ **维护版本控制** - 在 Git 中管理机器人定义，而不仅仅是通过 Amazon Lex 服务，可以为您提供版本控制和审计跟踪记录。与仅使用 AWS 管理控制台 或修改存储在中的机器人不同，更改会跟踪 APIs 到各个开发者 AWS。

通过自动执行 Amazon Lex 机器人的发布流程，团队可以更快地交付功能，同时降低风险和工作量。机器人仍处于版本控制之下，而非孤立存在于 Amazon Lex 控制台中。

## 先决条件和限制
<a name="streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow-prereqs"></a>

**先决条件**
+ 该工作流程涉及多个 AWS 账户 不同的环境（开发、生产和 DevOps），这需要账户管理和跨账户访问配置。
+ Python 3.9 可在您的部署环境或管道中使用。
+ 已在本地工作站上[安装](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)并配置 Git 以进行源代码控制。
+ AWS Command Line Interface (AWS CLI) [已安装](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)并配置为使用命令行或 Python 进行身份验证。

**限制**
+ **存储库访问权限** - 该工作流假设持续集成和持续交付（CI/CD）管道具有向源代码存储库提交更改所需的权限。
+ **初始机器人版本** — 该工具要求使用 AWS CloudFormation 模板部署机器人的初始版本。在自动化工作流接管前，您必须创建机器人的第一个版本迭代并将其提交到存储库。
+ **合并冲突** – 尽管该工作流旨在支持并行开发，但在整合来自不同分支的更改时，仍有可能出现合并冲突。可能需要手动干预来解决机器人配置中的冲突。

**产品版本**
+ [Python 3.9](https://www.python.org/downloads/) 或更高版本
+ [AWS CDK v2 2.12](https://docs.aws.amazon.com/cdk/api/versions.html) 4.0 或更高版本
+ [适用于 Python (Boto3) 的 AWS SDK](https://docs.aws.amazon.com/pythonsdk/)1.28 或更高版本

## 架构
<a name="streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow-architecture"></a>

下图展示了该解决方案的高层级架构及关键组件。

![\[自动开发和部署 Amazon Lex 机器人的工作流。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/3c7f9d16-9708-43c4-afa6-9d804d6b9dad/images/cdc73e82-a777-4e88-8bf8-a73c9bacb47f.png)


关键组件包括：
+ **Lex 机器人存储库** – 用于存储 Amazon Lex 机器人的 IaC 定义的 Git 存储库。
+ **DevOps**— AWS 账户 专门为开发和部署过程提供 CI/CD 管道和相关资源。
+ Pipelin@@ **es** — 自动执行机器人开发和部署生命周期各个阶段的 AWS CodePipeline 实例，例如创建新机器人、导出机器人定义、导入机器人定义和删除机器人。
+ **工单机器人和主机器人** – Amazon Lex 机器人资源，其中，工单机器人是由各个团队或开发人员开发的、针对特定功能的机器人；主机器人则是整合了所有功能的基准机器人。

该架构图展示了以下工作流：

1. **基准主机器人** – 该工作流的起点是在开发（Dev）环境中对主机器人进行基准测试。主机器人是后续开发和功能新增的基础。

1. **创建工单机器人** – 当需要开发新功能或进行变更时，将创建一个工单机器人。工单机器人本质上是主机器人的副本或分支，开发人员可基于它开展工作，且不会影响主机器人版本。

1. **导出工单机器人** - 工单机器人开发完成后，从 Amazon Lex 服务中导出。随后，包含该工单机器人的分支会基于主分支进行变基操作。此步骤可确保纳入工单机器人开发期间对主机器人所做的任何更改，从而减少潜在的冲突。

1. **导入变基后的工单机器人并验证** – 将变基后的工单机器人重新导入开发环境，并进行验证，确保其能与主分支的最新变更协同工作且功能正常。如果验证成功，则会创建拉取请求（PR），将工单机器人更改合并到主分支中。

1. **删除工单机器人** – 将更改成功合并到主分支后，便不再需要工单机器人了。此时可删除工单机器人，以保持环境整洁且易于管理。

1. **将主机器人部署到开发环境中并测试** – 将更新后的主机器人（现在包括新功能或更改）部署到开发环境中。在此环境中对其进行全面测试，以确保所有功能均能按预期运行。

1. **将主机器人部署到生产环境中** – 在开发环境中完成测试并成功后，将主机器人部署到生产环境中。此步骤是该工作流的最终阶段，新功能将在此阶段对最终用户开放使用。

**自动化和扩展**

自动化工作流支持开发人员在独立分支中并行开发不同的功能。这为并行开发提供了便利，助力团队实现高效协作并更快地交付功能。由于各分支相互隔离，因此可在不阻碍或干扰其他进行中工作的前提下完成更改的合并与部署。

该工作流可自动完成机器人版本在不同环境（例如开发环境、测试环境和生产环境）中的部署与推广。

将机器人定义存储在 Git 等版本控制系统中，可提供完整的审计跟踪记录并实现高效协作。更改可追溯至具体开发人员，确保整个开发生命周期的透明度和问责制。此外，这种方法还便于开展代码审查，帮助团队在部署到生产环境前发现并解决问题。

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

## 工具
<a name="streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow-tools"></a>

**AWS 服务**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)是一个开源软件开发框架，用于通过使用熟悉的编程语言在代码中定义 AWS 云 基础架构，并通过它进行配置 CloudFormation。此模式中的示例实现使用 Python。
+ [AWS CDK 命令行界面 (AWS CDK CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)- AWS CDK 工具包是与您的 AWS CDK 应用程序交互的主要工具。它执行您的应用程序，查询您定义的应用程序模型，并生成和部署 CDK 生成的 CloudFormation 模板。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)帮助您设置 AWS 资源，快速一致地配置资源，并在和的整个 AWS 账户 生命周期中对其进行管理 AWS 区域。此模式 CloudFormation 用于使用基础设施即代码部署 Amazon Lex 机器人配置和相关资源。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一项完全托管式构建服务，可编译源代码、运行单元测试和生成部署就绪的构件。此模式 CodeBuild 用于构建和打包部署工件。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可帮助您快速对软件发布过程的不同阶段进行建模和配置，并自动执行持续发布软件变更所需步骤。这种模式 CodePipeline 用于协调持续交付管道。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一个开源工具，可帮助您AWS 服务 通过命令行 shell 中的命令进行交互。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用 AWS 资源，从而帮助您安全地管理对资源的访问权限。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [Amazon Lex V2](https://docs.aws.amazon.com/lexv2/latest/dg/what-is.html) AWS 服务 用于为使用语音和文本的应用程序构建对话界面（机器人）。
+ [适用于 Python (Boto3) 的 AWS SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html)是一个软件开发套件，可帮助您将 Python 应用程序、库或脚本与集成 AWS 服务。

**其他工具**
+ [Git](https://git-scm.com/docs) 是开源分布式版本控制系统。

**代码存储库**

此模式的代码可在-ama GitHub [management-framework-sample-forzon-](https://github.com/aws-samples/management-framework-sample-for-amazon-lex) lex 存储库中找到。代码库包含以下文件夹和文件：
+ `prerequisite`文件夹-包含用于设置所需资源和环境的 CloudFormation 堆栈定义（使用 AWS CDK）。
+ `prerequisite/lexmgmtworkflow` 文件夹 – Lex 管理工作流项目的主目录，包含堆栈定义和 Python 代码。
+ `prerequisite/tests` – 包含单元测试代码。
+ `src` 文件夹 - 源代码目录，包含 Amazon Lex 机器人管理封装程序和实用工具。
+ `src/dialogue_lambda` – 对话钩子 Lambda 函数的源代码目录，该函数在用户与 Amazon Lex 机器人对话期间拦截并处理用户输入。

## 最佳实践
<a name="streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow-best-practices"></a>
+ **关注点分离**
  + 在开发环境和生产环境之间保持明确的 DevOps责任分工。
  +  AWS 账户 为每个环境单独使用以强制适当的隔离和安全边界。
  + 使用跨账户角色和最低权限访问原则，确保环境之间的访问受控。
+ **基础设施即代码**
  + 定期审查并更新基础设施代码，确保其符合最佳实践并适配不断变化的需求。
  + 为源代码存储库制定明确的分支与合并策略
+ **测试和验证**
  + 在管道的各个阶段实施自动化测试，以便在开发周期的早期发现问题。
  + 在将机器人推广到级别更高的环境前，使用 Amazon Lex 控制台或自动化测试框架来验证机器人的配置和功能。
  + 考虑为生产环境或关键环境的部署设置手动审批环节。
+ **监控和记录**
  + 为管道、部署和机器人交互设置监控和日志记录机制。
  + 监控管道事件、部署状态和机器人性能指标，以便及时发现并解决问题。
  + 使用 AWS 服务（例如 Amazon CloudWatch AWS CloudTrail、和） AWS X-Ray 进行集中记录和监控。
  + 定期审查并分析自动化工作流的性能、效率及有效性。
+ **安全与合规**
  + 实施安全编码实践，并遵循 Amazon Lex 机器人开发和部署 AWS 的安全最佳实践。
  + 定期审查并更新 IAM 角色、策略及权限，使其符合最低权限原则。
  + 考虑在管道中集成安全扫描与合规性检查。

## 操作说明
<a name="streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow-epics"></a>

### 为 Amazon Lex 机器人管理设置 IaC
<a name="set-up-iac-for-lex2-bot-management"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置本地 CDK 环境 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow.html) | AWS DevOps | 
| 在 `devops` 环境中创建跨账户角色。 | 该`devops`账户负责托管和管理 CI/CD 管道。要使 CI/CD 管道能够与`dev`和`prod`环境交互，请运行以下命令在账户中创建跨账户角色。`devops`<pre>cdk bootstrap --profile=devops<br /><br />cdk deploy LexMgmtDevopsRoleStack -c dev-account-id=2222222222222 -c prod-account-id=333333333333 --profile=devops</pre> | AWS DevOps | 
| 在 `dev` 环境中创建跨账户角色。 | 在 `dev` 账户中创建具有必要权限的 IAM 角色，以允许`devops` 账户承担此角色。 CI/CD 管道使用此角色在`dev`账户中执行操作，例如部署和管理 Amazon Lex 机器人资源。要创建 IAM 角色，请运行以下命令：<pre>cdk bootstrap --profile=dev<br /><br />cdk deploy LexMgmtCrossaccountRoleStack -c devops-account-id=1111111111111 --profile=dev</pre> | AWS DevOps | 
| 在 `prod` 环境中创建跨账户角色。 | 在 `prod` 账户中创建具有必要权限的 IAM 角色，以允许`devops` 账户承担此角色。 CI/CD 管道使用此角色在`prod`账户中执行操作，例如部署和管理 Amazon Lex 机器人资源。<pre>cdk bootstrap --profile=prod<br /><br />cdk deploy LexMgmtCrossaccountRoleStack -c devops-account-id=1111111111111 --profile=prod</pre> | AWS DevOps | 
| 在 `devops` 环境中创建管道。 | 要管理 Amazon Lex 机器人的开发工作流，请运行以下命令在 `devops` 环境中设置管道。<pre>cdk deploy LexMgmtWorkflowStack -c devops-account-id=1111111111111 -c dev-account-id=2222222222222 -c prod-account-id=333333333333 --profile=devops</pre> | AWS DevOps | 

### 为主机器人建立基准
<a name="establish-the-baseline-for-the-main-bot"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 定义主机器人的初始版本。 | 要定义主机器人的初始版本，请[触发](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts.html#concepts-triggers) `BaselineBotPipeline` 管道。该管道部署 CloudFormation 模板中定义的基本机器人定义，将主机器人定义导出为.json 文件。并将主机器人代码存储在版本控制系统中。 | AWS DevOps | 

### 实施功能开发工作流
<a name="implement-the-feature-development-workflow"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建工单机器人以开发并测试功能。 | `TicketBot` 是从功能分支中的现有主机器人定义导入的新机器人实例。这种方法可确保新机器人具有主机器人当前所有的功能和配置。要定义工单机器人的初始版本，请触发 `CreateTicketBotPipeline` 管道。该管道会在版本控制系统中创建新的功能分支，并基于主机器人创建新的工单机器人实例。 | Lex 机器人开发人员 | 
| 开发并测试工单机器人的功能。 | 要开发和测试该功能，请登录 AWS 管理控制台 并打开 Amazon Lex 控制台，网址为[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/)。有关更多信息，请参阅 Amazon Lex 文档中的[使用控制台测试机器人](https://docs.aws.amazon.com/lexv2/latest/dg/test-bot.html)。通过 `TicketBot` 实例，您现在可以添加、修改或扩展机器人的功能以实现新特性。例如，您可以创建或修改意图、话语、槽位和对话流。有关更多信息，请参阅 Amazon Lex 文档中的[添加意图](https://docs.aws.amazon.com/lexv2/latest/dg/add-intents.html)。 | Lex 机器人开发人员 | 
| 导出工单机器人定义。 | 导出的机器人定义本质上是以 JSON 格式表示的机器人的配置和功能。要导出工单机器人定义，请触发 `ExportTicketBotPipeline` 管道。该管道将工单机器人定义导出为 .json 文件，并将工单机器人代码存储在版本控制系统的功能分支中。 | Lex 机器人开发人员 | 
| 基于最新主分支对功能分支执行变基操作。 | 在开发新功能的过程中，主分支可能会收到来自不同开发人员或团队的其他更改。要将这些更改整合到功能分支中，请执行 Git `rebase` 操作。此操作本质上是将功能分支中的提交记录“重放”到主分支的最新提交记录之上，确保功能分支包含所有最新更改。 | Lex 机器人开发人员 | 
| 导入并验证变基后的工单机器人。 | 对功能分支执行变基操作后，必须将其导入工单机器人实例。此次导入会用变基分支的最新更改来更新现有工单机器人。要导入变基后的工单机器人，请触发 `ImportTicketBotPipeline` 管道。该管道会将版本控制系统功能分支中的工单机器人定义 .json 文件导入到 `TicketBot` 实例中。 | Lex 机器人开发人员 | 
| 验证变基后的机器人定义。 | 导入变基后的机器人定义后，验证其功能至关重要。您需要确保新功能按预期运行，且不会与现有功能产生冲突。此验证通常包括使用各种输入场景测试机器人、检查响应以及验证机器人的行为是否符合预期。您可以通过以下任一方式执行验证：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow.html) | Lex 机器人开发人员 | 
| 将功能分支合并到主分支中。 | 在独立的 `TicketBot` 实例中完成新功能的开发与测试后，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow.html) | Lex 机器人开发人员、存储库管理员 | 
| 删除功能分支和工单机器人。 | 当功能分支成功合并到主分支后，从源代码存储库中删除该功能分支和工单机器人。要删除功能分支和工单机器人，请触发 `DeleteTicketBotPipeline` 管道。该管道会删除开发过程中创建的临时机器人资源（例如，工单机器人）。此操作有助于保持存储库的整洁，避免与未来的功能分支产生混淆或冲突。 | Lex 机器人开发人员 | 

### 维护主机器人
<a name="maintain-the-main-bot"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将最新的主机器人定义导入到 `dev` 环境中。 | 要将主分支中最新的主机器人定义导入到 `dev` 环境中，请触发 `DeployBotDevPipeline` 管道。该管道还会在审批通过后创建一个 Git 标签。 | AWS DevOps | 
| 将最新的主机器人定义导入到 `prod` 环境中。 | 要将主分支中最新的机器人定义导入到 `prod` 环境中，请提供上一个任务中的标签引用作为参数并触发 `DeployBotProdPipeline` 管道。该管道将最新的机器人定义从特定标签导入到 `prod` 环境中。 | AWS DevOps | 

## 问题排查
<a name="streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 当您将 Amazon Lex 机器人部署到其他账户时 AWS 账户，工具服务必须具有访问这些账户中的资源的必要权限。 | 要授予跨账户访问权限，请使用 IAM 角色和策略。在目标账户中创建 IAM 角色，并将策略附加到授予所需权限的角色。然后，从部署 Amazon Lex 机器人的账户承担这些角色。有关更多信息，请参阅 Amazon Lex 文档中的[导入所需的 IAM 权限](https://docs.aws.amazon.com/lexv2/latest/dg/import.html#import-permissions)以及[在 Lex V2 中导出机器人所需的 IAM 权限](https://docs.aws.amazon.com/lexv2/latest/dg/export.html#export-permissions)。 | 

## 相关资源
<a name="streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow-resources"></a>
+ [在 Amazon Lex V2 中导入机器人](https://docs.aws.amazon.com/lexv2/latest/dg/import.html)
+ [在中启动管道 CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-about-starting.html)
+ [使用 Amazon Lex V2 机器人](https://docs.aws.amazon.com/lexv2/latest/dg/building-bots.html)