S3对象级别的事件没有被触发。

7

我已在AWS事件桥中创建了一个事件规则,其事件模式为:

{
  "source": [
    "aws.s3"
  ]
}

Target 是 CloudWatch 的日志组。 现在,当我在存储桶级别更改某些内容,例如存储桶权限时,我会在 CloudWatch 中看到捕获的事件,但是当我添加/删除 S3 存储桶中的文件时,什么也没有发生。这里出了什么问题?

4个回答

7
要记录对象级别的事件,您需要在CloudTrail的跟踪中启用S3的数据事件日志记录。如果您还没有跟踪信息,则需要创建一个,并确保为s3启用了数据事件日志记录。

1
这篇博客文章宣布的功能非常误导人,激活数据事件的要求在任何地方都没有提到 :-\ - Remi D

1

您可以通过捕获对象事件并确保在存储桶级别启用了从S3到Event Bridge的S3通知,或者通过CloudTrail API日志记录来向Event Bridge发送对象级事件。如果您想要捕获几个存储桶的事件,则第一种方法更容易。但是,如果您想要捕获所有或许多存储桶的事件,则建议使用CloudTrail方法。

直接将对象事件发送到Event Bridge

要将对象级事件从S3发送到Event Bridge,请确保在存储桶属性下启用了向Event Bridge的通知:

bucket properties to enable event bridge notifications

如果您正在使用CloudFormation,则可以通过NotificationConfiguration属性进行访问。
然后,您可以创建一个事件桥接规则来捕获此存储桶的操作。以下是一个示例,用于捕获对象创建:
{
  "detail-type": ["Object Created"],
  "source": ["aws.s3"],
  "detail": {
    "bucket": {
      "name": ["my-bucket"]
    }
  }
}

通过CloudTrail将对象事件发送到Event Bridge

如果要捕获多个存储桶的S3事件,则首选使用CloudTrail API方法。正如@Marcin的回答中所指出的,您必须创建一个捕获S3数据事件的CloudTrail trail。在创建trail时,在“选择日志事件”部分,最好切换到“基本事件选择器”,以选择单个存储桶或跨所有存储桶的事件。一旦您创建了一个trail,那么您就可以创建一个Event Bridge规则来捕获CloudTrail API事件。以下是用于捕获对象创建的示例:

{
  "detail-type": ["AWS API Call via CloudTrail"],
  "source": ["aws.s3"],
  "detail": {
    "eventSource": ["s3.amazonaws.com"],
    "eventName": ["PutObject"]
  }
}

如果您想将此调用限制为特定的存储桶,则可以进一步自定义规则:
{
  "detail-type": ["AWS API Call via CloudTrail"],
  "source": ["aws.s3"],
  "detail": {
    "eventSource": ["s3.amazonaws.com"],
    "requestParameters": {
      "bucketName": ["my-bucket"]
    },
    "eventName": ["PutObject"]
  }
}

1
我猜你为这个事件规则创建了一个自定义的事件总线。根据AWS网站,只有来自AWS服务的事件才会被发送到“默认”事件总线。所以,你必须在“默认”事件总线上创建事件规则。

Event bus


0
你需要在你的S3存储桶上启用EventBridge通知。
只需打开S3控制台,找到你的存储桶,打开属性选项卡,向下滚动到事件通知,点击编辑,将“将所有事件的通知发送到Amazon EventBridge”设置为“开启”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接