亚马逊AWS官方博客

新增 – 将 Amazon S3 事件通知与 Amazon EventBridge 结合使用

我们于 2019 年中推出了 Amazon EventBridge,让您能够轻松构建任何规模的强大、事件驱动型的应用程序。自该发布以来,我们添加了几项重要功能,包括架构注册表归档和重播事件的功能、对跨区域事件总线目标的支持以及 API 目标,让您可以将事件发送到任何 HTTP API。EventBridge 支持很长的目标列表,并且能够进行模式匹配、筛选和事件路由,是一个非常强大且灵活的架构组件。

S3 事件通知
我们让您可以更轻松地使用 EventBridge 构建能够快速高效地响应 S3 对象中的更改的应用程序。这是一种新的“直接连接”模式,比以往任何时候都更快,更可靠,更对开发人员友好。您不再需要制作对象的其他副本或编写专门的单一用途代码来处理事件。

此时,您可能会认为自己已经有能力对 S3 对象中的更改作出反应,并且想知道这里发生了什么。早在 2014 年,我们就推出了 SNS 主题、SQS 队列和 Lambda 函数的 S3 事件通知。这曾经(现在仍然是)一项非常强大的功能,但是在企业级使用它可能需要在原本独立的团队和对相同对象和事件有共同兴趣的应用程序之间进行协调。此外,EventBridge 已经可以从 CloudTrail 日志中提取 S3 API 调用,并使用它们进行模式匹配和筛选。同样,对于许多类型的应用程序来说,功能非常强大且效果非常棒(重点是审计和日志记录),但我们总是希望做得更好。

无修改空间,您现在可以将 S3 事件通知配置为直接发送到 EventBridge! 这种新模式为您带来了多项好处,包括:

高级筛选 – 您可以筛选许多其他元数据字段,包括对象大小、键名称和时间范围。这比使用需要回调 S3 以获取更多元数据,从而就正确的操作方案作出决策的 Lambda 函数更有效。S3 仅发布符合规则的事件,因此您只需为自己感兴趣的事件付费即可节省资金。

多个目标 – 您可以通过 API 目标将同一事件通知发送到您选择的 18 种 AWS 服务,包括 Step Functions、Kinesis Firehose、Kinesis Data Streams 和 HTTP 目标。这比创建自己的扇出机制容易得多,而且还可以帮助您应对独立团队想要自己处理事件的企业级情况。

快速、可靠的调用 – 快速直接地匹配模式(并调用目标)。由于 S3 至少向 EventBridge 提供一次事件传送,因此您的应用程序将更加可靠。

您还可以利用其他 EventBridge 功能,包括归档然后重播事件的功能。这允许您在发生错误或向事件总线添加新目标时重新处理事件。

入门指南
我只要几分钟就能开始。我首先要在我的一个 S3 存储桶上启用 EventBridge 通知(在本例中为 jbarr-public)。我打开 S3 控制台,找到我的存储桶,打开 Properties(属性)选项卡,向下滚动到 Event notifications(事件通知),然后单击 Edit(编辑):

我选择 On(开),点击 Save changes(保存更改),然后就可以滚动了:

现在我使用 EventBridge 控制台来创建规则。像往常一样,我首先输入名称和描述:

然后我定义一个匹配存储桶和感兴趣事件的模式:

一个模式可以匹配一个或多个存储桶和一个或多个事件;支持以下事件:

  • 对象已创建
  • 对象已删除
  • 对象还原已启动
  • 对象还原已完成
  • 对象还原已过期
  • 对象标签已添加
  • 对象标签已删除
  • 对象 ACL 已更新
  • 对象存储类别已更改
  • 对象访问等级已更改

然后我选择原定设置事件总线,将目标设置为 SNS 主题 (BucketAction),该主题将消息发布到我的 Amazon 电子邮件地址:

我点击 Create(创建),我已经准备好了。为了测试一下,我只需将一些文件上传到我的存储桶,然后等待消息:

消息包含有关事件的所有有趣且相关的信息,并且(在结束引用和格式化之后)如下所示:

{
    "version": "0",
    "id": "2d4eba74-fd51-3966-4bfa-b013c9da8ff1",
    "detail-type": "Object Created",
    "source": "aws.s3",
    "account": "348414629041",
    "time": "2021-11-13T00:00:59Z",
    "region": "us-east-1",
    "resources": [
        "arn:aws:s3:::jbarr-public"
    ],
    "detail": {
        "version": "0",
        "bucket": {
            "name": "jbarr-public"
        },
        "object": {
            "key": "eb_create_rule_mid_1.png",
            "size": 99797,
            "etag": "7a72374e1238761aca7778318b363232",
            "version-id": "a7diKodKIlW3mHIvhGvVphz5N_ZcL3RG",
            "sequencer": "00618F003B7286F496"
        },
        "request-id": "4Z2S00BKW2P1AQK8",
        "requester": "348414629041",
        "source-ip-address": "72.21.198.68",
        "reason": "PutObject"
    }

我最初的事件模式非常简单,只匹配存储桶名称。我可以使用基于内容的筛选来编写更复杂、更有趣的模式。例如,我可以使用数字匹配来设置匹配事件的模式,而这些事件针对小于 1MB 的对象:

{
    "source": [
        "aws.s3"
    ],
    "detail-type": [
        "Object Created",
        "Object Deleted",
        "Object Tags Added",
        "Object Tags Deleted"
    ],

    "detail": {
        "bucket": {
            "name": [
                "jbarr-public"
            ]
        },
        "object" : {
            "size": [{"numeric" :["<=", 1048576 ] }]
        }
    }
}

或者,我可以使用前缀匹配来设置一种模式,查找上载到存储桶的“子文件夹”(实际上并不存在)的对象:

"object": {
  "key" : [{"prefix" : "uploads/"}]
  }]
}

您可以将所有这些功能与所有现有的 EventBridge 功能结合使用,包括归档/重播。您还可以访问每个规则的 CloudWatch 指标:

现已推出
这项功能现已推出,您可以立即在所有 AWS 商业区域中开始使用。对于符合规则的每 100 万个事件,您需要支付 1 美元;有关更多信息,请查看 EventBridge 定价页面。

Jeff