本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Amazon API Gateway 和 Amazon DynamoDB Streams 异步处理事件
Andrea Meroni、Mariem Kthiri、Nadim Majed、Alessandro Trisolini 和 Michael Wallner,Amazon Web Services
Summary
Amazon API Gateway 是一项完全托管的服务,开发人员可以使用它来创建、发布、维护、监控和保护 APIs 任何规模。它可以处理涉及接受和处理多达几十万个并发 API 调用的所有任务。
集成超时是 API Gateway 的一个重要服务配额。超时是指后端服务必须返回响应的最大时限,超过该时限后,REST API 将返回错误。对于同步工作负载而言,29 秒的硬性限制通常是可以接受的。但是,对于想要将 API Gateway 用于异步工作负载的开发人员来说,这个限制是挑战。
此模式显示了使用 API Gateway、Amazon DynamoDB Streams 和异步处理事件的示例架构。 AWS Lambda此架构支持使用相同的输入参数运行并行处理作业,并且使用基本的 REST API 作为接口。在此示例中,使用 Lambda 作为后端将作业的持续时间限制为 15 分钟。您可以通过使用替代服务来处理传入的事件(例如 AWS Fargate)来规避此限制。
Projen
先决条件和限制
先决条件
活跃的 AWS 账户
您的工作站上已安装以下工具:
AWS Cloud Development Kit (AWS CDK) 工具包版本 2.85.0 或更高版本
Docker
版本 20.10.21 或更高版本 Node.js
版本 18 或更高版本 Projen
版本 0.71.111 或更高版本 Python
版本 3.9.16 或更高版本
限制
为避免节流,建议将 DynamoDB Streams 的读取者数量上限设置为两个。
作业的运行时上限受限于 Lambda 函数的运行时上限(15 分钟)。
并发作业请求的最大数受 Lambda 函数预留并发数的限制。
架构
架构
下图显示了任务 API 与 DynamoDB Streams 以及事件处理和错误处理 Lambda 函数的交互,事件存储在亚马逊事件档案中。 EventBridge

典型的工作流程包含以下步骤:
您通过 AWS Identity and Access Management (IAM) 进行身份验证并获取安全证书。
您将 HTTP
POST请求发送到/jobs作业 API 端点,并在请求正文中指定作业参数。作业 API 返回包含作业标识符的 HTTP 响应。
作业 API 将任务参数放在
jobs_tableAmazon DynamoDB 表中。jobs_tableDynamoDB 表 DynamoDB 流调用事件处理 Lambda 函数。事件处理 Lambda 函数处理事件,然后将作业结果放入
jobs_tableDynamoDB 表中。为了帮助确保结果一致,事件处理函数实施乐观锁机制。您通过第 3 步中的作业标识符
{jobId},向/jobs/{jobId}作业 API 端点发送 HTTPGET请求。作业 API 查询
jobs_tableDynamoDB 表以检索作业结果。作业 API 返回包含作业结果的 HTTP 响应。
如果事件处理失败,事件处理函数的源映射将此事件发送到事件处理 Amazon Simple Notification Service(Amazon SNS)主题。
错误处理 SNS 主题异步将事件推送到错误处理函数。
错误处理函数将作业参数放入
jobs_tableDynamoDB 表中。您可以向
/jobs/{jobId}作业 API 端点发送 HTTPGET请求,检索作业参数。如果错误处理失败,错误处理功能会将事件发送到 Ama EventBridge zon 档案。
您可以使用重播存档的事件 EventBridge。
工具
AWS 服务
AWS Cloud Development Kit (AWS CDK) 是一个软件开发框架,可帮助您在代码中定义和预调配 AWS 云基础设施。
Amazon DynamoDB 是一项完全托管式 NoSQL 数据库服务,可提供快速、可预测、可扩展的性能。
Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如,AWS Lambda 函数、使用 API 目标的 HTTP 调用端点或其他 Amazon Web Services account 中的事件总线。
AWS Lambda 是一项计算服务,可帮助您运行代码,无需预调配或管理服务器。它只在需要时运行您的代码,并自动进行扩展,因此您只需为使用的计算时间付费。
Amazon Simple Notification Service (Amazon SNS) 可帮助您协调和管理发布者与客户端(包括 Web 服务器和电子邮件地址)之间的消息交换。
其他工具
autopep8
会根据 Python 增强提案(PEP)8 风格指南自动格式化 Python 代码。 Bandit
会扫描 Python 代码,查找常见的安全问题。 Commitizen
是 Git 提交检查器和 CHANGELOG生成器。cfn-lint 是个傻瓜
AWS CloudFormation Checkov
是一款静态代码分析工具,用于检查基础设施即代码(IaC)是否存在安全性和合规性配置错误。 jq
是一个用于解析 JSON 的命令行工具。 Postman
是 API 平台。 pre-commit
是 Git 挂钩管理器。 Projen
是项目生成器。 pytest
是一个 Python 框架,用于编写可读的小型测试。
代码存储库
此示例架构代码可以在使用 API Gateway 和 DynamoDB Streams 进行 GitHub 异步处理
最佳实践
此示例架构不包括对已部署基础设施的监控。如果您的使用案例需要监控,请评估添加 CDK 监控构造
或其他监控解决方案。 此示例架构使用 IAM 权限来控制对作业 API 的访问权限。任何被授权接管
JobsAPIInvokeRole的人员皆可调用作业 API。因此,访问控制机制是二进制的。如果您的使用案例需要更复杂的授权模型,请使用不同的访问控制机制进行评估。当用户向
/jobs作业 API 端点发送 HTTPPOST请求时,系统将在两个不同的层级验证输入数据:API Gateway 负责执行第一个请求的验证。
事件处理函数执行第二个请求。
当用户向
/jobs/{jobId}作业 API 端点发出 HTTPGET请求时,不会执行任何验证。如果您的用例需要额外的输入验证和更高的安全级别,请评估使用 AWS WAF 来保护您的 API。
为避免节流,DynamoDB Streams 文档建议用户不要从同一数据流分片中使用超过两个使用者进行读取。为了横向扩展使用者数量,我们建议使用 Amazon Kinesis Data Streams。
本示例使用乐观锁确保
jobs_tableDynamoDB 表中的项目得到一致更新。根据使用案例要求,您可能需要实施更可靠的锁机制,例如悲观锁。
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
克隆存储库。 | 要在本地克隆存储库,请运行以下命令:
| DevOps 工程师 |
设置项目。 | 将目录更改为存储库根目录,然后使用 Projen
| DevOps 工程师 |
安装预提交挂钩。 | 要安装预提交挂钩,请执行以下操作:
| DevOps 工程师 |
| Task | 说明 | 所需技能 |
|---|---|---|
Bootstrap AWS CDK。 | 要AWS CDK
| AWS DevOps |
部署示例架构。 | 要在中部署示例架构 AWS 账户,请运行以下命令:
| AWS DevOps |
| Task | 说明 | 所需技能 |
|---|---|---|
安装测试先决条件。 | 在您的工作站上安装(AWS Command Line InterfaceAWS CLI)、Postman 建议使用 Postman | DevOps 工程师 |
承担 | 承担
| AWS DevOps |
配置 Postman。 |
| AWS DevOps |
测试示例架构。 | 要测试示例架构,请向作业 API 发送请求。有关更多信息,请参阅 Postman 文档 | DevOps 工程师 |
问题排查
| 问题 | 解决方案 |
|---|---|
由于 Amazon Lo CloudWatch gs 日志组 |
|