使用 Amazon API Gateway 和 Amazon DynamoDB Streams 异步处理事件 - AWS Prescriptive Guidance

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

使用 Amazon API Gateway 和 Amazon DynamoDB Streams 异步处理事件

由安德里亚·梅罗尼 (AWS)、亚历山德罗·特里索里尼 ()、纳迪姆·马吉德 (AWS)、Mariem Kthiri (AWS) 和迈克尔·沃尔纳 () 创作 AWS AWS

摘要

Amazon API Gateway 是一项完全托管的服务,开发人员可以使用它来创建、发布、维护、监控和保护APIs任何规模。它可以处理接受和处理多达数十万个并发API呼叫所涉及的任务。

Gate API way 的一个重要服务配额是集成超时。超时是后端服务在返回错误之前必须RESTAPI返回响应的最长时间。对于同步工作负载,29 秒的硬限制通常是可以接受的。但是,对于那些想要将 Gate API way 用于异步工作负载的开发人员来说,这个限制是一个挑战。

此模式显示了使用API网关、Amazon DynamoDB Streams 和异步处理事件的示例架构。 AWS Lambda该架构支持使用相同的输入参数运行并行处理作业,并且使用基本接口RESTAPI作为接口。在此示例中,使用 Lambda 作为后端将任务的持续时间限制为 15 分钟。您可以通过使用替代服务来处理传入的事件(例如 AWS Fargate)来规避此限制。

Projen 与 T AWS Cloud Development Kit (AWS CDK) oo lkit、Docker 和 Node.js 结合使用 AWS 账户,用于设置本地开发环境并将示例架构部署到目标。Projen 通过预提交和用于代码质量保证、安全扫描和单元测试的工具自动设置 Python 虚拟环境。有关更多信息,请参阅 “工具” 部分。

先决条件和限制

先决条件

限制

  • 为了避免限制,建议的 DynamoDB Streams 读取器的最大数量为两个。

  • 任务的最大运行时间受到 Lambda 函数的最大运行时间(15 分钟)的限制。

  • 并发任务请求的最大数量受到 Lambda 函数预留并发性的限制。

架构

架构

下图显示了任务API与 DynamoDB Streams 以及事件处理和错误处理 Lambda 函数的交互情况,事件存储在亚马逊事件档案中。 EventBridge

架构和流程图,图后列出了步骤。

典型的工作流程包括以下步骤:

  1. 您通过 AWS Identity and Access Management (IAM) 进行身份验证并获取安全证书。

  2. 您向/jobs任务API端点发送HTTPPOST请求,在请求正文中指定任务参数。

  3. 任务会向您API返回包含任务标识符的HTTP响应。

  4. 这些任务将任务参数API放在 jobs_table Amazon DynamoDB 表中。

  5. jobs_tableDynamoDB 表 DynamoDB 流调用事件处理 Lambda 函数。

  6. 事件处理 Lambda 函数处理事件,然后将任务结果放入 DynamoDB 表中。jobs_table为了帮助确保结果一致,事件处理函数实现了乐观锁定机制

  7. 您向/jobs/{jobId}任务API端点发送HTTPGET请求,步骤 3 中的任务标识符为{jobId}

  8. 这些作业会API查询 jobs_table DynamoDB 表以检索任务结果。

  9. 作业会API返回包含任务结果的HTTP响应。

  10. 如果事件处理失败,则事件处理函数的源映射会将事件发送到错误处理亚马逊简单通知服务 (Amazon) 主题。SNS

  11. 错误处理SNS主题异步将事件推送到错误处理函数。

  12. 错误处理函数将作业参数放在 DynamoD jobs_table B 表中。

    您可以通过向任务API端点发送HTTPGET请求来检索/jobs/{jobId}任务参数。

  13. 如果错误处理失败,错误处理功能会将事件发送到 Ama EventBridge zon 档案。

    您可以使用重播存档的事件 EventBridge。

工具

AWS 服务

  • AWS Cloud Development Kit (AWS CDK)是一个软件开发框架,可帮助您在代码中定义和配置AWS云基础架构。

  • Amazon DynamoDB 是一项完全托管的SQL无数据库服务,可提供快速、可预测和可扩展的性能。

  • Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如,AWSLambda 函数、使用API目标的HTTP调用终端节点或其他账户中的事件总线。AWS

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

  • 亚马逊简单通知服务 (AmazonSNS) 可帮助您协调和管理发布者与客户之间的消息交换,包括网络服务器和电子邮件地址。

其他工具

  • autopep8 会根据 Python 增强提案 (PEP) 8 风格指南自动格式化 Python 代码。

  • Bandit 会扫描 Python 代码以查找常见的安全问题。

  • C@@ ommitizen 是一个 Git 提交检查器和生成器。CHANGELOG

  • cfn-lint 是个傻瓜 AWS CloudFormation

  • Checkov 是一种静态代码分析工具,用于检查基础设施即代码 (IaC) 是否存在安全性和合规性错误配置。

  • jq 是一个用于解析的命令行工具。JSON

  • Postman 是一个API平台。

  • p@@ re-comm it 是一个 Git 挂钩管理器。

  • Projen 是一个项目生成器。

  • pytest 是一个 Python 框架,用于编写可读的小型测试。

代码存储库

此示例架构代码可在使用API网关和 DynamoDB Streams 进行 GitHub 异步处理存储库中找到。

最佳实践

  • 此示例架构不包括对已部署基础设施的监控。如果您的用例需要监控,请评估添加CDK监控结构或其他监控解决方案。

  • 此示例架构使用IAM权限来控制对作业的访问权限API。任何有权承担任务的人JobsAPIInvokeRole都可以调用这些作业API。因此,访问控制机制是二进制的。如果您的用例需要更复杂的授权模型,请使用不同的访问控制机制进行评估。

  • 当用户向/jobs任务API端点发送HTTPPOST请求时,将在两个不同的级别上验证输入数据:

    • APIGateway 负责第一个请求的验证

    • 事件处理函数执行第二个请求。

      当用户向/jobs/{jobId}作业API端点发出HTTPGET请求时,不会执行任何验证。如果您的用例需要额外的输入验证和更高的安全级别,请评估使用 AWS WAF 来保护您的API

  • 为避免限制,DynamoDB Streams 文档不鼓励用户使用两个以上的使用者阅读来自同一个直播分片的分片。为了扩大消费者数量,我们建议使用亚马逊 Kinesis Data Stre ams。

  • 本示例中使用了@@ 乐观锁定来确保 jobs_table DynamoDB 表中项目的一致更新。根据用例要求,您可能需要实现更可靠的锁定机制,例如悲观锁定。

操作说明

任务描述所需技能

克隆存储库。

要在本地克隆存储库,请运行以下命令:

git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk.git
DevOps 工程师

设置项目。

将目录更改为存储库根目录,然后使用 P rojen 设置 Python 虚拟环境和所有工具:

cd asynchronous-event-processing-api-gateway-api-gateway-dynamodb-streams-cdk npx projen
DevOps 工程师

安装预提交挂钩。

要安装预提交挂钩,请执行以下操作:

  1. 激活 P ython 虚拟环境

    source .env/bin/activate
  2. 安装预提交挂钩:

    pre-commit install pre-commit install --hook-type commit-msg
DevOps 工程师
任务描述所需技能

Bootstrap AWS CDK。

AWS CDK在中进行引导 AWS 账户,请运行以下命令:

AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap
AWS DevOps

部署示例架构。

要在中部署示例架构 AWS 账户,请运行以下命令:

AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy
AWS DevOps
任务描述所需技能

安装测试先决条件。

在你的工作站上安装 AWS Command Line Interface (AWS CLI)Postmanj q。

建议使用 Postman 来测试此示例架构,但这不是强制性的。如果您选择其他API测试工具,请确保它支持 S AWSignature 版本 4 身份验证,并参考可通过导出来检查的暴露API端点RESTAPI。

DevOps 工程师

假设JobsAPIInvokeRole.

假设JobsAPIInvokeRole那是作为deploy命令的输出打印出来的:

CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \ --no-cli-pager \ --role-arn $<JOBS_API_INVOKE_ROLE_ARN> \ --role-session-name JobsAPIInvoke) export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’) export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’) export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)
AWS DevOps

配置 Postman。

  • 要导入存储库中包含的 Postman 集合,请按照 Postman 文档中的说明进行操作。

  • 使用以下值设置JobsAPI变量

    • accessKeyα assume-role 命令中Credentials.AccessKeyId属性的值。

    • baseUrldeploy 命令JobsApiJobsAPIEndpoint输出的值,不带尾部斜杠。

    • region− 示例架构的部署 AWS 区域 位置的价值。

    • seconds− 示例作业的输入参数值。它必须是正整数。

    • secretKeyα assume-role 命令中Credentials.SecretAccessKey属性的值。

    • sessionTokenα assume-role 命令中Credentials.SessionToken属性的值。

AWS DevOps

测试示例架构。

要测试示例架构,请向作业发送请求API。有关更多信息,请参阅 Postman 文档

DevOps 工程师

故障排除

事务解决方案

由于 Amazon Lo CloudWatch gs 日志组/aws/apigateway/JobsAPIAccessLogs已经存在,因此销毁和随后重新部署示例架构会失败。

  1. 如有必要,请将您的日志数据导出到亚马逊简单存储服务 (Amazon S3)

  2. 删除 CloudWatch 日志日志组/aws/apigateway/JobsAPIAccessLogs

  3. 重新部署示例架构。

相关资源