简介

在我的S3 存储桶通知帖子中,我谈到了如何使用 S3 存储桶 NotificationConfiguration 来捕获 S3 事件并触发 Lambda 函数。虽然这种方法效果很好,但它有一些局限性,对于更大和复杂的系统设置可能不是最好的工程工作。在这篇文章中,我们将讨论另一种使用 AWS EventBridge 实现相同功能的选项。该项目的源代码可在Github中找到。在此之前,让我们讨论一下它的功能限制

它只能发出与存储桶对象相关的事件。他们是

  • S3:对象已创建

  • S3:对象已移除

  • S3:对象恢复

  • S3:减少冗余丢失对象

  • S3:复制

它不支持存储桶操作的事件,例如存储桶创建、删除、设置 Acl 等。

S3 通知支持的目标也非常有限:-

  • AWS Lambda

  • AWS SQS

  • AWS SES

如果我想将事件路由到 AWS 步骤函数,那么我无法做到这一点。它缺乏触发 EC2、Ecs、Kinesis、Codepipeline 等常用服务的能力。

与 S3 存储桶耦合

在分布式架构的世界中,最好有尽可能多的解耦。在无服务器系统中,很容易提供可以独立部署和管理每个资源的基础架构。然而,在 S3 通知中似乎并非如此。如果我们看 Cloudformation 模板,它需要与桶资源一起配置,从而产生资源耦合。

S3 存储桶在分层路径中存储大量数据。存储客户详细信息的存储桶可以具有如下路径

  • 存储桶/{date}/{purchase category}/{purchaseId}

  • 桶/{date}/Orders/{OrderId}

  • 桶/{date}/failedtransactions/

  • 桶/{date}/Successtransactions/

每个路径都可以包含单独的业务价值实体,并且它们具有自己的服务和自己的处理管道集。在这样的真实用例中,我们不希望存储桶与一个通知系统紧密相连。为了解决这个问题,亚马逊为我们提供了另一种更适合我们讨论的用例的事件处理机制。

AWS EventBridge

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--PdkDzZAs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/7yf2dqn1ck9iguqadxf4.png)

Amazon EventBridge 是一种无服务器发布/订阅服务,可帮助构建基于事件、松散耦合和高度可扩展的分布式架构解决方案。它从不同的事件源捕获实时事件,并将它们路由到由事件规则引导的目标服务。

为什么选择 EventBridge

  • 它不是为仅处理 S3 事件而构建的,而是可以处理来自许多 AWS 服务、Web 应用程序和 Saas 应用程序的事件。

  • 它提供原生支持来连接 Auth0、Mongodb、Shopify、Zendesk 等 Saas 应用程序,这些应用程序易于配置并确保更好的安全性。有关可以充当源的 Aws 服务列表,请参阅AWS EventBridge 源

缓解 S3 通知的限制

  • 对于 S3,它不仅支持对象事件,还支持特定于桶的事件,如 createBucket、deleteBucket、安全等。这些事件对于存储桶非常重要并且用户尝试对其进行修改的情况很重要。

  • 与 S3 NotificationConfiguration 不同,EventBridge 和规则是独立的资源。它们不是 S3 存储桶的一部分,因此可以单独添加、删除、配置和部署资源。

带有 EventBridge 的客户购买系统

现在我们将使用 EventBridge 重新实现客户购买系统S3 存储桶通知。我们将使用默认事件总线和 CloudTrail 来捕获对象级 S3 事件。该系统的主要组成部分是:-

  • ApiGateway with POST Api :- 发送客户购买信息。

  • PurchaseDataInput Lambda :- 在 S3 存储桶中以 JSON 文件的形式创建一个对象。它包含购买数据。

  • 事件总线:- 传入事件的默认事件总线。

  • CloudTrail :- 将记录 PutObject 事件并存储在 eventbridge-trail 存储桶中的 CloudTrail。与存储客户购买数据的存储桶相比,这是一个单独的存储桶。我们不会在这篇文章中介绍 CloudTrail 的详细信息,因为它超出了这个范围。

  • PurchaseDataProcess Lambda :- 此 lambda 是 EventBridge 的目标。它将包含购买信息的电子邮件发送给客户。

云化

注意:事件规则与桶创建部分没有紧密联系。

部署和测试

  • 运行./deploy.sh 部署堆栈

  • 运行 ./callapi.sh 调用 POST 请求。

两种方法的事件比较

让我们比较两种方法生成的事件。下面的代码块是 PurchaseDataProcess Lambda 的部分。只需添加 console.log 即可在 CloudWatch 日志中添加日志。

const AWS = require('aws-sdk');
AWS.config.update({ region: process.env.region });

exports.handler = async (event) => {
    try {
        console.log(event)
        const {bucketName, key } = event.detail.requestParameters

图像显示了事件数据的差异。 EventBridge 事件由独特的属性“source”、“detail-type”和“detail”组成。 EventBridge 规则使用这些属性来过滤事件。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--zEl7qzbr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/9twuy4l5iecnvxg6rnk4.png)

总结

  • EventBridge 提供必要的工具来构建更可靠、可扩展和事件驱动的架构和应用程序。

  • 它支持 AWS 服务、自定义应用程序和 SAAS 应用程序作为事件源,易于集成。

  • 它支持 17 个 AWS 服务作为目标,这又是一大优势。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐