

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

# 部署和测试 Amazon SNS Event Fork Pipelines 示例应用程序
<a name="sns-deploy-test-fork-pipelines-sample-application"></a>

为了加快事件驱动型应用程序的开发，您可以订阅 Amazon SNS 主题的事件处理管道（由事件 AWS 分叉管道提供支持）。 AWS Event Fork Pipelines 是一套基于[AWS 无服务器应用程序模型](https://aws.amazon.com/serverless/sam/) (SA AWS M) 的开源[嵌套](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html)应用程序，您可以直接从 Ev [AWS ent Fork Pipelines 套件](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines)（选择**显示创建自定义 IAM 角色或资源策略的应用程序**）将其部署到您的 AWS 账户中。有关更多信息，请参阅 [AWS 事件分叉管道的工作原理](sns-fork-pipeline-as-subscriber.md#how-sns-fork-works)。

本页介绍如何使用部署和测试 E AWS vent Fork Pipelines 示例应用程序。 AWS 管理控制台 

**重要**  
为避免在部署完 AWS 事件分支管道示例应用程序后产生不必要的费用，请删除其 CloudFormation 堆栈。有关更多信息，请参阅 *AWS CloudFormation 用户指南*中的[在 CloudFormation 控制台上删除堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)。

# AWS 事件分叉管道用例示例
<a name="example-sns-fork-use-case"></a>

以下场景描述了一个使用 Event Fork Pipelines AWS 的事件驱动型无服务器电子商务应用程序。您可以在中使用此[示例电子商务应用程序](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-example-ecommerce-checkout-api)， AWS Serverless Application Repository 然后 AWS 账户 使用控制台将其部署到您的 AWS Lambda 控制台中，您可以在其中对其进行测试并检查其源代码 GitHub。

![\[集成 AWS 服务的无服务器电子商务应用程序的架构。它描绘了从电子商务用户通过 API Gateway 下订单到包括订单存储、搜索分析和重播在内的不同处理管道的流程，展示了如何通过 Amazon SNS、Lambda、Amazon SQS、DynamoDB 和 Kibana 管理和分析事件。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/sns-fork-example-use-case.png)


该电子商务应用程序通过 RESTful API Gateway托管并由该 AWS Lambda 功能支持的API接受买家的订单`CheckoutApiBackendFunction`。此函数将收到的所有订单发布到名为 `CheckoutEventsTopic` 的 Amazon SNS 主题，该主题转而将订单分散到四个不同的管道。

第一个管道是由电子商务应用程序的拥有者设计和实现的常规结算处理管道。该管道具有用于缓冲所有已收到订单的 Amazon SQS 队列`CheckoutQueue`、一个名为`CheckoutFunction`的 AWS Lambda 函数，用于轮询队列以处理这些订单，还有一个用于安全保存所有已下订单的 DynamoDB 表`CheckoutTable`。

## 应用 AWS 事件分叉管道
<a name="applying-sns-fork-pipelines"></a>

电子商务应用程序的组件处理核心业务逻辑。但是，电子商务应用程序拥有者还需满足：
+ **合规性** - 安全的、压缩的静态加密备份，清理敏感信息
+ **弹性** - 在执行过程中断的情况下重播最近的订单
+ **可搜索性** - 对已下订单运行分析并生成指标

应用程序所有者无需实现此事件处理逻辑，而是可以订阅 `CheckoutEventsTopic` Amazon SNS 主题的 AWS Event Fork Pipelines
+ [事件存储与备份管线](sns-fork-pipeline-as-subscriber.md#sns-fork-event-storage-and-backup-pipeline)配置为转换数据以删除信用卡详细信息，缓冲数据 60 秒，使用 GZIP 压缩数据，并使用 Amazon S3 的原定设置客户自主管理型密钥来加密数据。此密钥由 () 管理 AWS 并由 AWS Key Management Service (AWS KMS) 提供支持。

  有关更多信息，请参阅《Amazon Data Firehose 开发人员指南》**中的[为您的目的地选择 Amazon S3](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-s3)、[Amazon Data Firehose 数据转换](https://docs.aws.amazon.com/firehose/latest/dev/data-transformation.html)和[配置设置](https://docs.aws.amazon.com/firehose/latest/dev/create-configure.html)。
+ 为[事件搜索与分析管线](sns-fork-pipeline-as-subscriber.md#sns-fork-event-search-and-analytics-pipeline)配置了一个 30 秒的索引重试持续时间、一个用于存储无法在搜索域中编制索引的订单的存储桶和一个用来限制已编制索引的订单集的筛选策略。

  有关更多信息，请参阅 *Amazon Data Firehose 开发者*指南中的[为您的目的地选择 OpenSearch 服务](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-elasticsearch)。
+ [事件重播管线](sns-fork-pipeline-as-subscriber.md#sns-fork-event-replay-pipeline) 为配置了常规订单处理管道（由电子商务应用程序拥有者设计和实施）的 Amazon SQS 队列部分。

  有关更多信息，请参阅 *Amazon Simple Queue Service 开发人员指南*中的[队列名称和 URL](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-general-identifiers.html#queue-name-url)。

在事件搜索与分析管道的配置中设置以下 JSON 筛选策略。它仅匹配总金额为 100 美元或更多的传入订单。有关更多信息，请参阅 [Amazon SNS 消息筛选](sns-message-filtering.md)。

```
{				
   "amount": [{ "numeric": [ ">=", 100 ] }]
}
```

使用 E AWS vent Fork Pipelines 模式，电子商务应用程序所有者可以避免开发开销，这种开销通常是在为事件处理编写非微分逻辑之后出现的。取而代之的是，她可以将 AWS 事件分叉管道直接从部署 AWS Serverless Application Repository 到她身上 AWS 账户。

# 第 1 步：部署 Amazon SNS 示例应用程序
<a name="deploy-sample-application"></a>

1. 登录 [AWS Lambda 控制台](https://console.aws.amazon.com/lambda/)。

1. 在导航面板上，选择 **Functions (函数)**，然后选择 **Create function (创建函数)**。

1. 在 **Create function (创建函数)** 页面上，执行以下操作：

   1. 依次选择 **Browse serverless app repository（浏览无服务器应用程序存储库）**、**Public applications（公共应用程序）**、**Show apps that create custom roles or resource policies（显示创建 IAM 角色或资源策略的应用程序）**。

   1. 搜索 `fork-example-ecommerce-checkout-api`，然后选择该应用程序。

1. 在 **fork-example-ecommerce-checkout-api** 页面上，执行以下操作：

   1. 在 **Application settings (应用程序设置)** 部分中，输入 **Application name (应用程序名称)**（例如，`fork-example-ecommerce-my-app`）。
**注意**  
要稍后轻松找到您的资源，请保留前缀 `fork-example-ecommerce`。
对于每个部署，应用程序名称必须唯一。如果您重复使用应用程序名称，则部署将仅更新先前部署的 CloudFormation 堆栈（而不是创建新的堆栈）。

   1. （可选）输入以下**LogLevel**设置之一以执行应用程序的 Lambda 函数：
      + `DEBUG`
      + `ERROR`
      + `INFO`（默认值）
      + `WARNING`

1. 选择 **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications (我确认此应用程序创建自定义 IAM 角色和资源策略并部署嵌套应用程序)**，然后在页面底部选择 **Deploy (部署)**。

在 **fork-example-ecommerce-的部署状态*my-app***页面上，Lambda 会显示 “**您的应用程序正在部署中**” 状态。

在**资源**部分中， CloudFormation 开始创建堆栈并显示每个资源的 **CREATE\$1IN\$1PROGRESS** 状态。该过程完成后， CloudFormation 将显示 “**创建\$1完成**” 状态。

**注意**  
部署所有资源可能需要 20-30 分钟。

部署完成后，Lambda 将显示 **Your application has been deployed（您的应用程序已部署完成）**状态。

# 步骤 2：执行与 SNS 关联的示例应用程序
<a name="execute-sample-application"></a>

1. 在 AWS Lambda 控制台的导航面板上，选择**应用程序**。

1. 在 **Applications (应用程序)** 页面上的搜索字段中，搜索 `serverlessrepo-fork-example-ecommerce-my-app`，然后选择该应用程序。

1. 在 **Resources (资源)** 部分中，执行以下操作：

   1. 例如，要查找类型为的资源 **ApiGatewayRestApi**，请按**类型**对资源进行排序`ServerlessRestApi`，然后展开该资源。

   1. 将显示两个嵌套资源，分别是 “**ApiGateway部署**” 和 “**ApiGateway阶段**”。

   1. 复制链接 **Prod API endpoint (Prod API 终端节点)** 并为其附加 `/checkout`，例如：

      ```
      https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
      ```

1. 将以下 JSON 复制到名为 `test_event.json` 的文件中。

   ```
   {
      "id": 15311,
      "date": "2019-03-25T23:41:11-08:00",
      "status": "confirmed",
      "customer": {
         "id": 65144,		
   	 "quantity": 2,
         "price": 25.00,
         "subtotal": 50.00
      }]
   }
   ```

1. 要将 HTTPS 请求发送到您的 API 端点，请通过执行 `curl` 命令来将示例事件负载作为输入传递，例如：

   ```
   curl -d "$(cat test_event.json)" https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
   ```

   API 将返回以下空响应，并指示已成功执行：

   ```
   { }
   ```

# 第 3 步：验证 Amazon SNS 应用程序和管道性能
<a name="verify-sample-application-pipelines"></a>

## 步骤 1：验证示例签出管道的执行
<a name="verify-execution-checkout-pipeline"></a>

1. 登录 [Amazon DynamoDB 控制台](https://console.aws.amazon.com/dynamodb/)。

1. 在导航面板上，选择**表**。

1. 搜索 `serverlessrepo-fork-example` 并选择 `CheckoutTable`。

1. 在表详细信息页面上，选择**项目**，然后选择已创建的项目。

   将显示存储的属性。

## 步骤 2：验证事件存储与备份管道的执行
<a name="verify-execution-event-storage-backup-pipeline"></a>

1. 登录 [Amazon S3 控制台](https://console.aws.amazon.com/s3/)。

1. 在导航面板上，选择 **Buckets (存储桶)**。

1. 搜索 `serverlessrepo-fork-example`，然后选择 `CheckoutBucket`。

1. 导航目录层次结构，直到找到扩展名为 `.gz` 的文件。

1. 要下载该文件，请依次选择 **Actions (操作)** 和 **Open (打开)**。

1. 为管道配置了一个 Lambda 函数，此函数将清理信用卡信息以实现合规性。

   要验证存储的 JSON 负载不包含任何信用卡信息，请解压缩该文件。

## 步骤 3：验证事件搜索与分析管道的执行
<a name="verify-execution-event-search-analytics-pipeline"></a>

1. 登录到[OpenSearch 服务控制台](https://console.aws.amazon.com/aos/)。

1. 在导航面板上的 **My domains (我的域)** 下，选择前缀为 `serverl-analyt` 的域。

1. 为管道配置了一个 Amazon SNS 订阅筛选策略，该策略设置一个数值匹配条件。

   ****要验证该事件是否因为指的是价值高于100美元的订单而被索引，请在**服务器分析*abcdefgh1ijk*页面上选择指数，checkout\$1even** ts。****

## 步骤 4：验证事件重播管道的执行
<a name="verify-execution-event-replay-pipeline"></a>

1. 登录 [Amazon SQS 控制台](https://console.aws.amazon.com/sqs/)。

1. 在队列列表中，搜索 `serverlessrepo-fork-example` 并选择 `ReplayQueue`。

1. 选择**发送和接收消息**。

1. 在 **fork-example-ecommerce-*my-app*... ReplayP-ReplayQueue-中发送和接收消息*123ABCD4E5F6***对话框中，选择**轮询留**言。

1. 要验证事件是否已入队，请选择队列中显示的消息旁边的 **More Details (更多详细信息)**。

# 步骤 4：模拟问题并重播事件以进行恢复
<a name="simulate-issue-replay-events-for-recovery"></a>

## 步骤 1：启用模拟的问题并发送第二个 API 请求
<a name="enable-simulated-issue-send-second-api-request"></a>

1. 登录 [AWS Lambda 控制台](https://console.aws.amazon.com/lambda/)。

1. 在导航面板上，选择 **Functions (函数)**。

1. 搜索 `serverlessrepo-fork-example` 并选择 `CheckoutFunction`。

1. 在 **fork-example-ecommerce-*my-app*-CheckoutFunction-*ABCDEF*...** **页面的**环境变量**部分中，将 **BUG\$1** ENABLED 变量设置**为 true**，然后选择保存。**

1. 将以下 JSON 复制到名为 `test_event_2.json` 的文件中。

   ```
   {
   	   "id": 9917,
   	   "date": "2019-03-26T21:11:10-08:00",
   	   "status": "confirmed",
   	   "customer": {
   	      "id": 56999,
   "quantity": 1,
   	      "price": 75.00,
   	      "subtotal": 75.00
   	   }]
   	}
   ```

1. 要将 HTTPS 请求发送到您的 API 端点，请通过执行 `curl` 命令来将示例事件负载作为输入传递，例如：

   ```
   curl -d "$(cat test_event_2.json)" https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
   ```

   API 将返回以下空响应，并指示已成功执行：

   ```
   { }
   ```

## 步骤 2：验证模拟数据损坏
<a name="verify-simulated-data-corruption"></a>

1. 登录 [Amazon DynamoDB 控制台](https://console.aws.amazon.com/dynamodb/)。

1. 在导航面板上，选择**表**。

1. 搜索 `serverlessrepo-fork-example` 并选择 `CheckoutTable`。

1. 在表详细信息页面上，选择**项目**，然后选择已创建的项目。

   将显示存储的属性，其中一些标记为 **CORRUPTED\$1 (已损坏\$1)**

## 步骤 3：禁用模拟的问题
<a name="disable-simulated-issue"></a>

1. 登录 [AWS Lambda 控制台](https://console.aws.amazon.com/lambda/)。

1. 在导航面板上，选择 **Functions (函数)**。

1. 搜索 `serverlessrepo-fork-example` 并选择 `CheckoutFunction`。

1. 在 **fork-example-ecommerce-*my-app*-CheckoutFunction-*ABCDEF*...** **页面的**环境变量**部分中，将 **BUG\$1** ENABLED 变量设置**为 false**，然后选择保存。**

## 步骤 4：启用重播以从问题中恢复
<a name="enable-replay-recover-from-simulated-issue"></a>

1. 在 AWS Lambda 控制台的导航面板上，选择**功能**。

1. 搜索 `serverlessrepo-fork-example` 并选择 `ReplayFunction`。

1. 展开 **Designer** 部分，选择 **SQS** 磁贴，然后在 **SQS** 部分中，选择 **Enabled (启用)**。
**注意**  
启用 Amazon SQS 事件源触发器大约需要 1 分钟。

1. 选择**保存**。

1. 要查看已恢复的属性，请返回到 Amazon DynamoDB 控制台。

1. 要禁用重播，请返回 AWS Lambda 控制台并禁用 Amazon SQS 事件源触发器。`ReplayFunction`