使用HTTP API服务集成构建存储优先的无服务器应用程序

2020-08-30 03:39:17

在过去的一年里,我一直在谈论“存储优先”的无服务器模式。使用这些模式,可以在应用任何业务逻辑之前持久存储数据。此模式的优势在于提高了应用程序的弹性。通过在处理前持久化数据,原始数据在发生错误时仍然可用。

使用Amazon API Gateway作为AWS Lambda函数的代理是无服务器应用程序中的常见模式。Lambda功能处理业务逻辑,并与其他AWS或第三方服务通信,以路由、修改或存储处理后的数据。一种选择是将数据放在Amazon Simple Queue Service(SQS)队列中,以便下游处理。在此模式中,开发人员负责处理Lambda函数代码中的错误和重试逻辑。

存储第一个模式将这一点颠倒过来。在运行任何代码之前,它在SQS层使用带有重试逻辑或死信队列(DLQ)的本机错误处理。通过将API Gateway直接集成到SQS中,开发人员可以在减少代码行的同时提高应用程序的可靠性。

以前,直接集成需要具有用Velocity模板语言(Velocity Template Language,VTL)编写的转换模板的RESTAPI。然而,开发人员告诉我们,他们希望以一种更简单的方式直接与服务集成,而不使用VTL。因此,HTTP API现在能够直接与五个AWS服务集成,而不需要转换模板或代码层。

此版本的HTTP API直接集成包括Amazon EventBridge、Amazon Kinesis数据流、简单队列服务(SQS)、AWS System Manager的AppConfig和AWS STEP函数。通过这些新集成,客户可以为托管在这些AWS服务中的业务逻辑创建API和WebHook。他们还可以利用HTTP API功能(如授权器、节流和增强的可观察性)来保护和监控这些应用程序。

用于EventBridge的HTTP API直接集成使用PutEvents API来支持客户端应用程序将事件放置在EventBridge总线上。一旦事件在总线上,EventBridge就会根据EventBridge过滤规则将事件路由到特定目标。

该集成是存储优先模式,因为在应用任何路由或逻辑之前将数据写入总线。如果下游目标服务有问题,则EventBridge将实施最多24小时增量后退的重试策略。此外,该集成还通过在总线上过滤事件来帮助开发人员减少代码。它路由到下游目标,而不需要Lambda作为传输层。

用于Kinesis数据流的HTTP API直接集成提供PutRecord集成操作,使客户端应用程序能够将事件放置在Kinesis数据流上。Kinesis数据流设计为每个碎片每秒可处理多达1,000次写入,有效负载大小高达1 MB。开发者可以通过增加数据流中的分片数量来提高吞吐量。您可以将传入数据路由到Amazon S3存储桶等目标,将其作为数据湖或Kinesis数据分析应用程序的一部分进行实时分析。

此集成是存储优先选项,因为数据在流中存储最多七天,直到被处理并路由到其他地方。当使用Lambda函数处理流事件时,通过可配置的错误处理策略在Lambda层处理错误。

针对Amazon SQS的HTTP API直接集成提供SendMessage、ReceiveMessage、DeleteMessage和PurgeQueue集成操作。此集成与EventBridge和Kinesis集成的不同之处在于数据双向流动。可以通过HTTP API端点通过REST调用从SQS队列创建、读取和删除事件。此外,可以使用PurgeQueue操作管理队列的完全清除。

此模式是存储优先模式,因为默认情况下,数据在队列中保留4天(可配置为14天),除非对其进行处理和删除。当Lambda服务轮询队列时,返回的消息在队列中隐藏一段时间。一旦调用服务处理了这些消息,它就会使用DeleteMessage API永久删除这些消息。

当使用SQS队列触发Lambda函数时,Lambda服务在内部管理此过程。但是,HTTPAPI与SQS的直接集成使开发人员能够将此过程转移到客户端应用程序,而不需要Lambda功能作为传输层。

AWS AppConfig的HTTP API直接集成提供GetConfiguration集成操作,并允许应用程序检查应用程序配置更新。通过HTTP API端点公开系统参数API,开发人员可以自动更改其应用程序的配置。虽然此集成不被视为存储优先集成,但它确实支持从外部服务到AppConfig的直接通信,而不需要Lambda功能作为传输层。

步骤函数的HTTP API直接集成提供了StartExecution和StopExecution集成操作。这些动作允许通过API对步骤函数状态机进行编程控制。当启动步骤函数工作流时,JSON数据在请求中传递并映射到状态机。停止执行时,错误消息也会映射到状态机。

此模式提供存储优先集成,因为步骤函数在编排的工作流的生命周期中维护持久状态。STEP函数还支持服务集成,允许工作流在不需要Lambda函数作为传输层的情况下发送和接收数据。

HTTP API服务集成可以使用AWS CLI、AWS SAM或通过API网关控制台构建。控制台通过上下文选择来帮助您了解每个集成需要什么。每个集成还包括一个高级部分,以提供集成的附加信息。

构建集成后,您可以将其导出为OpenAPI模板,该模板可与基础设施即代码(IAC)工具(如AWS SAM)配合使用。导出的模板还可以包括定义特定集成信息的API网关扩展。

从HTTP API到SQS的直接集成示例位于Sessions with SAM存储库中。此示例包括以下架构:

AWS SAM模板创建所需的HTTP API、SQS队列、Lambda函数以及身份和访问管理(IAM)角色。这都是由58行代码生成的,如下所示:

AWSTemplateFormatVersion:';2010-09-09'; 转型:AWS::Serverless-2016-10-31 说明:HTTP API直接集成 资源: 我的队列: 类型:aws::sqs::Queue MyHttpApi: 类型:aws::Serverless::HttpApi 物业: DefinitionBody: ';fn::Transform';: 名称:';aws::include'; 参数: 地点:';./api.yaml'; MyHttpApiRole: 类型:";Aws::iam::Role"; 物业: AssumeRolePolicyDocument: 版本:";2012-10-17"; 声明: -效果:";允许"; 委托人: 服务:";apigateway.amazonaws.com"; 行动: -";STS:AssumeRole"; 政策: -PolicyName:ApiDirectWriteToSQS PolicyDocument: 版本:';2012-10-17'; 声明: 行动: -SQS:SendMessage 效果:允许 资源: -!GetAtt MyQueue.Arn MyTriggeredLambda: 类型:AWS::Serverless::Function 物业: CodeUri:src/ 处理程序:app.lambdaHandler 运行时:nodejs12.x 政策: -SQSPollerPolicy: QueueName:!GetAtt MyQueue.QueueName 活动: SQSTrigger: 类型:SQS 物业: 队列:!GetAtt MyQueue.Arn 产出: 端点: 说明:";HTTP API端点URL"; 值:!SUB";Https://${MyHttpApi}.execute-api.${AWS::Region}.amazonaws.com";

OpenAPI模板处理HTTP API配置的路由定义并配置服务集成。模板如下所示:

Openapi:";3.0.1"; 信息: 标题:";my-sqs-api"; 路径: /: 帖子: 回应: 默认: 说明:";POST默认响应/"; X-Amazon-apigateway-集成: 集成子类型:";SQS-SendMessage"; 凭据: Fn::GetAtt:[MyHttpApiRole,Arn] RequestParameters: MessageBody:";$request.body.MessageBody"; QueueUrl: 参考:MyQueue PayloadFormatVersion:";1.0"; 类型:";AWS_PROXY“ ConnectionType:";互联网"; X-Amazon-apigateway-import export-version:";1.0";

由于OpenAPI模板通过转换包含在AWS SAM模板中,因此API Gateway集成可以引用在AWS SAM模板中创建的角色和服务。

这篇文章介绍了存储优先集成模式的概念,以及新的HTTPAPI直接集成如何提供帮助。我将介绍当前的五个集成以及每个集成可能的用例。此外,我还演示了如何使用AWS SAM将基础设施作为代码来构建和管理集成的应用程序。

将存储优先模式与直接集成结合使用可以帮助开发人员用更少的代码行构建更持久的无服务器应用程序。将数据从API端点传输到所需服务不再需要Lambda函数。相反,可以使用Lambda函数调用来区分业务逻辑。