本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Amazon API Gateway 和 AWS Lambda 异步处理事件
Andrea Meroni、Mariem Kthiri、Nadim Majed 和 Michael Wallner,Amazon Web Services
Summary
Amazon API Gateway 是一项完全托管的服务,开发人员可以使用它来创建、发布、维护、监控和保护 APIs 任何规模。它可以处理涉及接受和处理多达几十万个并发 API 调用的所有任务。
集成超时是 API Gateway 的一个重要服务配额。超时是指后端服务必须返回响应的最大时限,超过该时限后,REST API 将返回错误。对于同步工作负载而言,29 秒的硬性限制通常是可以接受的。但是,对于想要将 API Gateway 用于异步工作负载的开发人员来说,这个限制是挑战。
此模式显示了使用 API Gateway 和 AWS Lambda异步处理事件的架构示例。这个架构支持运行时长不超过 15 分钟的处理作业,并使用基本的 REST API 作为接口。
Projen
先决条件和限制
先决条件
限制
作业的运行时上限受限于 Lambda 函数的运行时上限(15 分钟)。
并发作业请求的最大数受 Lambda 函数预留并发数的限制。
架构
下图显示了任务 API 与事件处理和错误处理 Lambda 函数以及存储在 Amazon 事件档案中的事件之间的交互。 EventBridge

典型的工作流程包含以下步骤:
您通过 AWS Identity and Access Management (IAM) 进行身份验证并获取安全证书。
您将 HTTP
POST请求发送到/jobs作业 API 端点,并在请求正文中指定作业参数。作业 API(API Gateway REST API)返回一个包含作业标识符的 HTTP 响应。
作业 API 异步调用事件处理 Lambda 函数。
事件处理函数处理事件,然后将作业结果放入作业 Amazon DynamoDB 表中
您通过第 3 步中的作业标识符
{jobId},向/jobs/{jobId}作业 API 端点发送 HTTPGET请求。作业 API 查询
jobsDynamoDB 表以检索作业结果。作业 API 返回包含作业结果的 HTTP 响应。
事件处理函数将事件发送到错误处理函数(若事件处理失败)。
错误处理函数将作业参数放入
jobsDynamoDB 表中。您可以向
/jobs/{jobId}作业 API 端点发送 HTTPGET请求,检索作业参数。如果错误处理失败,则错误处理函数会将事件发送到 EventBridge 事件存档。
您可以使用重播存档的事件 EventBridge。
工具
AWS 服务
AWS Cloud Development Kit (AWS CDK)是一个软件开发框架,可帮助您在代码中定义和配置 AWS 云 基础架构。
AWS Command Line Interface (AWS CLI) 是一个开源工具,可帮助您通过命令行外壳中的命令与 AWS 服务进行交互。
Amazon DynamoDB 是一项完全托管式 NoSQL 数据库服务,可提供快速、可预测、可扩展的性能。
Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如,Lambda 函数、使用 API 目标的 HTTP 调用端点,或者其他 AWS 账户中的事件总线。
AWS Lambda 是一项计算服务,可帮助您运行代码,无需预调配或管理服务器。它只在需要时运行您的代码,并自动进行扩展,因此您只需为使用的计算时间付费。
其他工具
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 和 Lambda 进行 GitHub 异步事件处理
最佳实践
此示例架构不包括对已部署基础设施的监控。如果您的使用案例需要监控,请评估添加 CDK 监控构造
或其他监控解决方案。 此示例架构使用 IAM 权限来控制对作业 API 的访问权限。任何被授权接管
JobsAPIInvokeRole的人员皆可调用作业 API。因此,访问控制机制是二进制的。如果您的使用案例需要更复杂的授权模型,请使用不同的访问控制机制进行评估。当用户向
/jobs作业 API 端点发送 HTTPPOST请求时,系统将在两个不同的层级验证输入数据:Amazon API Gateway 负责执行第一个请求的验证。
事件处理函数执行第二个请求。
当用户向
/jobs/{jobId}作业 API 端点发出 HTTPGET请求时,不会执行任何验证。如果您的使用案例需要额外的输入验证和更高的安全级别,请评估如何使用 AWS WAF 来保护您的 API。
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
克隆存储库。 | 要在本地克隆存储库,请运行以下命令:
| DevOps 工程师 |
设置项目。 | 将目录更改为存储库根目录,然后使用 Projen
| DevOps 工程师 |
安装预提交挂钩。 | 要安装预提交挂钩,请执行以下操作:
| DevOps 工程师 |
| Task | 说明 | 所需技能 |
|---|---|---|
Bootstrap AWS CDK。 | 要 AWS CDK 在中进行引导 AWS 账户,请运行以下命令:
| AWS DevOps |
部署示例架构。 | 要在中部署示例架构 AWS 账户,请运行以下命令:
| AWS DevOps |
| Task | 说明 | 所需技能 |
|---|---|---|
安装测试先决条件。 | 在您的工作站上安装(AWS Command Line InterfaceAWS CLI)、Postman 建议使用 Postman | DevOps 工程师 |
承担 | 承担
| AWS DevOps |
配置 Postman。 |
| AWS DevOps |
测试示例架构。 | 要测试示例架构,请向作业 API 发送请求 | DevOps 工程师 |
问题排查
| 问题 | 解决方案 |
|---|---|
由于 Amazon Lo CloudWatch gs 日志组 |
|