AWS S3文件夹放置事件通知

时间:2019-02-22 22:40:45

标签: amazon-web-services amazon-s3 aws-lambda amazon-sqs

我已经用Python编写了一个将文件夹及其内容上载到S3的函数。现在,我希望S3生成一个事件(以便可以将其发送到lambda函数)。 S3仅允许在文件级别生成事件,实际上s3上的文件夹只是可视化层,这意味着S3没有文件夹的内部表示,具有相同根的键被简单地分组在一起。就是说,到目前为止,我已经提出了三种围绕“毒丸”概念的方法。

  1. 在文件夹上载过程结束时发送一个特殊文件,该文件的创建将向lambda发送一个事件,该事件可以打开文件以读取要执行的自定义指令。似乎这种方法非常灵活,但是在安全方面却引起了严重的担忧(出于这个原因,我知道ACL已经到位,但是我不确定是否足够),并且在下载/上传/删除该ACL时会产生一些开销文件从/到本地内存。

  2. 将事件映射到目标Lambda并直接将其触发。方法上的差异只是在这种情况下,我并没有真正在S3上创建文件,而是让S3相信。我将使用CloudWatch来触发自定义S3对象创建的事件,并带有要提取的lambda文件夹的名称。与其他两种方法相比,这种方法有点笨拙,而且当我对此事进行研究时,似乎应该不可能在AWS上生成“模拟”事件(即Trigger S3 create event)。但是据我了解,函数put_events应该可以解决问题。

  3. 使用SQS将允许将文件夹名称放入SQS任务中,以后可由lambda使用。与其他两种方法相比,这具有一些优势,因为SQS现在具有LIFO变体,可以实现一次准确交付,失败处理(通过死信队列)等,但是与之相比,这产生了不小的复杂性。其他方法。

目前,我正在尝试选择最“正确”的方法,并且 为了做到这一点,我试图权衡利弊以做出明智的决定,这使我提出了一些问题:

  • 是否有另一种我不希望进行的不涉及客户通知的方式? (所有上述方法都依赖于客户端以一种或另一种方式发送通知,这不是很“阴暗”)?

  • 方法2和3之间是否存在实质性差异,考虑到两者都依赖于将信息发送到流中和从流中发送出去(分别是CloudWatch和SQS)?

2 个答案:

答案 0 :(得分:1)

您是否考虑过使用S3存储桶事件的prefix选项,我对其进行了测试,并且效果很好。在我的S3存储桶中,我创建了两个文件夹test1和test2。在s3事件上,我在每次存储区lambda上的放置/复制操作被触发时都添加了前缀test1。

enter image description here

答案 1 :(得分:-1)

我认为您的问题可以归结为“在我已将充满文件的文件夹上载到S3之后,如何触发Lambda函数?”

除非先验服务器端有一些信息可用于确定文件夹上载何时完成,否则客户端将不得不告诉您。

我会考虑的选项:

  1. 更改您的客户端以在完成向S3的上传后将消息发布到SNS或SQS。然后,该消息可以触发您的Lambda函数。
  2. 将最后一个文件上载到文件夹images/dogs/之后,上载一个大小为零的对象,其密钥与文件夹(images/dogs/)相同。这是一个“前哨文件”。使用后缀为/的S3事件触发器来检测该“文件夹”对象的上传并触发您的Lambda。

我更喜欢第一种选择。它可以达到最终目的,而不会产生无关的S3对象。借助SNS,您还可以根据需要配置多个下游流程,以响应“完成上传”消息(扇出)。