

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

# 使用 AWS SAM 自动部署嵌套应用程序
<a name="automate-deployment-of-nested-applications-using-aws-sam"></a>

*Rahul Sharad Gaikwad 博士、Ishwar Chauthaiwale、Dmitry Gulin 和 Tabby Ward，Amazon Web Services*

## Summary
<a name="automate-deployment-of-nested-applications-using-aws-sam-summary"></a>

在亚马逊网络服务 (AWS) 上，AWS 无服务器应用程序模型 (AWS SAM) Model 是一个开源框架，它提供用于表达函数 APIs、数据库和事件源映射的速记语法。每个资源只需几行，您就可以定义所需应用程序并使用 YAML 对其进行建模。在部署过程中，SAM 将 SAM 语法转换并扩展为 AWS CloudFormation 语法，您可以使用该语法更快地构建无服务器应用程序。

AWS SAM 简化了 AWS 平台上的无服务器应用程序的开发、部署和管理。它提供标准化框架、更快的部署、本地测试功能、资源管理、与开发工具的无缝集成以及支持社区。这些功能使其成为了高效构建无服务器应用程序的宝贵工具。

该模式使用 AWS SAM 模板自动部署嵌套应用程序。嵌套应用程序是另一应用程序中的应用程序。父应用程序调用其子应用程序。这些是无服务器架构的松耦合组件。 

使用嵌套应用程序，您可重复使用独立编写和维护但使用 AWS SAM 和 Serverless Application Repository 组成的服务或组件，从而快速构建高度复杂的无服务器架构。嵌套应用程序可帮助您构建更强大的应用程序，避免重复工作，并确保整个团队和组织的一致性和最佳实践。为了演示嵌套应用程序，该模式部署了[示例 AWS 无服务器购物车应用程序](https://github.com/aws-samples/aws-sam-nested-stack-sample)。

## 先决条件和限制
<a name="automate-deployment-of-nested-applications-using-aws-sam-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户
+ 现有的虚拟私有云（VPC）和子网
+ 集成式开发环境，例如 Visual Studio Code（有关更多信息，请参阅 [AWS 上的构建工具](https://aws.amazon.com/getting-started/tools-sdks/#IDE_and_IDE_Toolkits)）
+ 使用 pip install wheel 安装 Python wheel 库（如果尚未安装）

**限制**
+ 无服务器应用程序中可以嵌套的最大应用程序数量为 200。
+ 嵌套应用程序的最大参数数量可以是 60。

**产品版本**
+ 此解决方案基于 AWS SAM 命令行界面 (AWS SAM CLI) 版本 1.21.1 构建，但此架构应适用于更高版本的 AWS SAM CLI。

## 架构
<a name="automate-deployment-of-nested-applications-using-aws-sam-architecture"></a>

**目标技术堆栈 **
+ Amazon API Gateway
+ AWS SAM
+ Amazon Cognito
+ Amazon DynamoDB
+ AWS Lambda
+ Amazon Simple Queue Service（Amazon SQS）队列

**目标架构**

下图显示了用户如何通过呼叫向购物服务发出请求 APIs。用户的请求（包括所有必要信息）将发送给 Amazon API Gateway 和 Amazon Cognito 授权机构，后者负责执行身份验证和授权机制。 APIs

当在 DynamoDB 中添加、删除或更新项目时，事件会被放入 DynamoDB Streams 中，DynamoDB Streams 又会启动 Lambda 函数。为了避免在同步工作流中立即删除旧项目，将消息放到 SQS 队列中，该队列会启动工作函数来删除消息。

![从 API Gateway 到 Lambda 函数再到 DynamoDB 和产品服务的 POST 和 PUT 操作。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/218adecc-b5b8-4193-9012-b5d584e2e128/images/5b454bae-5fd4-405d-a37d-6bafc3fcf889.png)


在此解决方案设置中，AWS SAM CLI 充当 AWS CloudFormation 堆栈的接口。AWS SAM 模板自动部署嵌套应用程序。父 SAM 模板调用子模板，父 CloudFormation 堆栈部署子堆栈。每个子堆栈都构建 AWS SAM CloudFormation 模板中定义的 AWS 资源。

![使用包含父堆栈和三个子 CloudFormation 堆栈的 AWS SAM CLI 的四步流程。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/218adecc-b5b8-4193-9012-b5d584e2e128/images/5828026e-72ad-4a3f-a5f2-bffac0f13e42.png)


1. 构建并部署堆栈。

1. 身份验证 CloudFormation 堆栈包含 Amazon Cognito。

1. 产品 CloudFormation 堆栈包含 Lambda 函数和 Amazon API Gateway

1. 购物 CloudFormation 堆栈包含 Lambda 函数、亚马逊 API Gateway、SQS 队列和亚马逊 DynamoDB 数据库。

## 工具
<a name="automate-deployment-of-nested-applications-using-aws-sam-tools"></a>

**工具**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 可帮助您创建、发布、维护、监控和保护任何规模的 RES WebSocket APIs T、HTTP。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可帮助您设置 AWS 资源，快速一致地配置这些资源，并在 AWS 账户和区域的整个生命周期中对其进行管理。
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) 为您的 Web 和移动应用程序提供身份验证、授权和用户管理。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，而无需预置或管理服务器。它仅在需要时运行您的代码，并且能自动扩缩，因此您只需为使用的计算时间付费。
+ [AWS Serverless Application Model (AWS SAM)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) 是一个帮助用于构建 AWS Cloud中无服务器应用程序的开源框架。
+ [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 提供了一个安全、持久且可用的托管队列，它可帮助您集成和分离分布式软件系统与组件。

**代码**

此模式的代码可在 GitHub [AWS SAM 嵌套堆栈示例](https://github.com/aws-samples/aws-sam-nested-stack-sample)存储库中找到。

## 操作说明
<a name="automate-deployment-of-nested-applications-using-aws-sam-epics"></a>

### 安装 AWS SAM CLI
<a name="install-aws-sam-cli"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 AWS SAM CLI。 | 要安装 AWS SAM CLI，请参阅 [AWS SAM 文档](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)中的说明。 | DevOps 工程师 | 
| 设置 AWS 凭证 | 要设置 AWS 凭证以便 AWS SAM CLI 可以代表您调用 Amazon Web Services，请运行 `aws configure` 命令并按照提示进行操作。<pre>$aws configure<br />AWS Access Key ID [None]: <your_access_key_id><br />AWS Secret Access Key [None]: your_secret_access_key<br />Default region name [None]:<br />Default output format [None]:</pre><br />有关设置凭证的更多信息，请参阅[身份验证和访问凭证](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html)。 | DevOps 工程师 | 

### 初始化 AWS SAM 项目
<a name="initialize-the-aws-sam-project"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆 AWS SAM 代码存储库。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-deployment-of-nested-applications-using-aws-sam.html) | DevOps 工程师 | 
| 部署模板，以初始化项目。 | 要初始化项目，请运行 `SAM init` 命令。当系统提示您选择模板来源时，选择 `Custom Template Location`。 | DevOps 工程师 | 

### 编译和构建 SAM 模板代码
<a name="compile-and-build-the-sam-template-code"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 查看 AWS SAM 应用程序模板。 | 查看嵌套应用程序模板。此示例使用以下嵌套应用程序模板：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-deployment-of-nested-applications-using-aws-sam.html) | DevOps 工程师 | 
| 查看父级模板。 | 查看将调用嵌套应用程序模板的模板。在此示例中，父模板是 `template.yml`。所有单独的应用程序都嵌套在单父模板 `template.yml` 中。 | DevOps 工程师 | 
| 编译和构建 AWS SAM 模板代码。 | 使用 AWS SAM CLI，运行以下命令。<pre>sam build</pre> | DevOps 工程师 | 

### 部署 AWS SAM 模板
<a name="deploy-the-aws-sam-template"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署应用程序。 | 要启动用于创建嵌套应用程序 CloudFormation 堆栈并在 AWS 环境中部署代码的 SAM 模板代码，请运行以下命令。<pre>sam deploy --guided --stack-name shopping-cart-nested-stack --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND</pre><br />此命令将提示几个问题。用 `y` 回答所有问题。 | DevOps 工程师 | 

### 验证部署
<a name="verify-the-deployment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证堆栈。 | 要查看在 AWS SAM 模板中定义的 AWS CloudFormation 堆栈和 AWS 资源，请执行以下操作：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-deployment-of-nested-applications-using-aws-sam.html) | DevOps 工程师 | 

## 相关资源
<a name="automate-deployment-of-nested-applications-using-aws-sam-resources"></a>

**参考**
+ [AWS Serverless Application Model (AWS SAM)](https://aws.amazon.com/serverless/sam/#:~:text=The%20AWS%20Serverless%20Application%20Model,and%20model%20it%20using%20YAML.)
+ [AWS SAM 开启 GitHub](https://github.com/aws/serverless-application-model)
+ [无服务器购物车微服务](https://github.com/aws-samples/aws-serverless-shopping-cart)（AWS 示例应用程序）

**教程和视频**
+ [构建无服务器应用程序](https://youtu.be/Hv3YrP8G4ag)
+ [AWS 在线技术讲座：使用 AWS SAM 构建与部署无服务器应用程序](https://youtu.be/1NU7vyJw9LU)

## 附加信息
<a name="automate-deployment-of-nested-applications-using-aws-sam-additional"></a>

所有代码都准备就绪后，该示例包含以下目录结构：
+ [sam\_stacks](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html) — 此文件夹包含 `shared.py` 层。层是包含库、自定义运行时系统或其他依赖项的文件存档。利用层，您可在函数中使用库，而不必将库包含在部署包中。
+ *product-mock-service*— 此文件夹包含所有与产品相关的 Lambda 函数和文件。
+ *shopping-cart-service*— 此文件夹包含所有与购物相关的 Lambda 函数和文件。