用户上传到S3存储桶时会收到通知吗?

ccl*_*eve 19 amazon-s3 amazon-web-services

可能重复:
新S3对象的通知

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

只要S3存储桶的内容发生变化,是否可以收到通知?如果以某种方式发送消息,说"此文件已添加/更新/删除:foo",那将会很酷.

除此之外,是否有一些我可以轮询的时间戳可以告诉最后一次更新存储桶?

如果我不能做这些事情中的任何一个,那么唯一的选择就是抓取整个存储桶并寻找变化.这将是缓慢而昂贵的.

Eri*_*ond 19

更新2014-11:

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

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

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

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

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

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

根据编写文档的方式,看起来亚马逊有想要添加其他通知事件的想法(例如,您可能想知道何时添加新密钥).

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

如果您希望获得近实时更新以进行处理,则可以使用SNS完成上传到S3的自定义事件通知;如果您希望让通知堆积起来并将其处理到队列中,则可以通过SQS完成上传到S3的自定义事件通知你自己的节奏.

如果您正在进行轮询,则可以通过让客户端上传前缀为"unprocessed/..."后跟唯一键来减少您需要请求的密钥数量.然后,您的轮询软件可以查询以该前缀开头的S3密钥.当它准备好处理时,它可以将密钥改为"处理/ ...",然后再改为"已处理/ ......"或其他.S3中的对象当前由S3执行的复制+删除操作重命名.

  • 对于非常高的吞吐量,我向SQS写入一条消息,其中包含S3中文件的URI.然后,多个线程可以处理SQS队列.是的,编写SQS消息会有开销,但这是必要的,并且分布在将文件发送到S3的所有线程中.如果亚马逊有一个标志在S3中创建SNS消息会更好,然后你可以订阅一个SQS队列来分配线程上的负载,但在此之前你必须将你自己的消息写入SNS或SQS. (4认同)