当用户上传到 S3 存储桶时收到通知? [复制]

Posted

技术标签:

【中文标题】当用户上传到 S3 存储桶时收到通知? [复制]【英文标题】:Get notified when user uploads to an S3 bucket? [duplicate] 【发布时间】:2012-01-30 06:24:29 【问题描述】:

可能重复:Notification of new S3 objects

我们有一个在 S3 上存储用户数据的应用。我们的应用程序中处理上传的部分与处理数据的部分是分离的。在某些情况下,用户可以直接将数据上传到 S3,而无需通过我们的应用程序(如果他们有自己的 S3 帐户并向我们提供凭据,则可能会发生这种情况)。

是否可以在 S3 存储桶的内容发生更改时收到通知?如果能以某种方式发送一条消息说“此文件已添加/更新/删除:foo”,那就太酷了。

除此之外,我是否可以在某个地方轮询某个时间戳来告知存储桶上次更新的时间?

如果我不能做这两件事,那么唯一的选择就是爬取整个存储桶并寻找更改。这将是缓慢且昂贵的。

【问题讨论】:

【参考方案1】:

2014-11 更新:

正如 Alan Illing 在 cmets 中指出的,AWS 现在支持从 S3 到 SNS 的通知,可以自动转发到 SQS:http://aws.amazon.com/blogs/aws/s3-event-notification/

S3 还可以向 AWS Lambda 发送通知以直接运行您自己的代码。

预测 S3->SNS 通知的原始响应:

如果亚马逊支持这一点,他们将使用 SNS 发送通知,告知对象已添加到存储桶中。但是,目前,S3 和 SNS 支持的唯一存储桶事件是在 Amazon S3 检测到它已丢失减少冗余存储 (RRS) 对象的所有副本并且无法再为该对象的请求提供服务时通知您。

以下是 S3 支持的 SNS 事件的文档:

http://docs.amazonwebservices.com/AmazonS3/latest/dev/NotificationHowTo.html

根据文档的编写方式,亚马逊似乎对添加其他通知事件有想法(比如您可能想知道何时添加了新键)。

鉴于亚马逊不直接支持,将对象上传到 S3 的 S3 客户端将需要触发通知,或者您需要进行某种轮询。

上传到 S3 的自定义事件通知可以使用 SNS 完成,如果您希望获得近乎实时的更新进行处理,或者如果您希望让通知堆积起来并处理它们,则可以通过 SQS 完成按照自己的节奏排队。

如果您进行轮询,您可以减少需要请求的密钥数量,方法是让客户端上传前缀为“未处理/...”,后跟唯一密钥。然后,您的轮询软件可以仅查询以该前缀开头的 S3 密钥。当它准备好处理时,它可以将密钥更改为“处理/...”,然后再更改为“已处理/...”或其他任何内容。 S3 中的对象目前通过 S3 执行的复制+删除操作重命名。

【讨论】:

对于较小体积的对象,名称的前缀可以正常工作。对于大量对象,这实际上会减慢 S3。 S3 内部根据存储桶名称/对象键对数据进行分区,具有相同前缀的键很可能最终在同一个分区中。对于高上传吞吐量,您需要在字符串的开头保持对象键的变化。详情请见:aws.typepad.com/aws/2012/03/… @dlaidlaw:正如亚马逊所描述的,即使没有特殊的密钥前缀分配,它也可以轻松处理每秒超过 100 个请求的突发。如果您处理传入队列的速度比这更快,则可以简单地使用“未处理”存储桶而不是前缀。但是,以这种速度,您很可能会使用并行处理器,此时建议使用单个轮询未处理文件列表的建议失效(您如何知道哪个线程正在处理哪个文件?)。 为了非常高的吞吐量,我向 SQS 写入一条消息,其中包含指向 S3 中文件的 URI。然后多个线程可以处理 SQS 队列。是的,编写 SQS 消息有开销,但这是必要的,并且分布在将文件发送到 S3 的所有线程中。如果亚马逊有一个标志来在 S3 中创建时发送 SNS 消息会更好,然后您可以订阅一个 SQS 队列以跨线程分配负载,但在此之前您必须将自己的消息写入 SNS 或SQS。 新上传的前缀在许多情况下是一个不错的实用建议(以及在许多执行批处理作业的 FTP 服务器上发生的情况)。 现在已内置到 S3 中:aws.amazon.com/blogs/aws/s3-event-notification

以上是关于当用户上传到 S3 存储桶时收到通知? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

上传到 S3 存储桶时出错,与 EndPoint 相关

将对象上传到 S3 存储桶时如何触发 AWS Cloudformation 堆栈的更新?

尝试将对象放入 s3 存储桶时,配置中缺少凭据

尝试使用 PUT 将 PDF 作为 blob 上传到 S3 存储桶时被禁止 403

从 S3 接入点复制到 Redshift

如何在同一 S3 位置复制和粘贴多个对象以生成 ObjectCreated 通知?