Amazon web services AWS S3文件夹放置事件通知

Amazon web services AWS S3文件夹放置事件通知,amazon-web-services,amazon-s3,aws-lambda,amazon-sqs,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Sqs,我用Python编写了一个函数,将文件夹及其内容上传到S3。现在我想让S3生成一个事件(这样我就可以将它发送给lambda函数)。S3只允许在文件级生成事件,事实上S3上的文件夹只是一个可视化层,这意味着S3没有文件夹的内部表示,具有相同根的键只是简单地分组在一起。这就是说,到目前为止,我已经提出了三种围绕“毒丸”概念的方法 在文件夹上载过程结束时发送一个特殊文件,该文件的创建会向lambda发送一个事件,该事件可以打开该文件以读取要执行操作的自定义指令。这种方法似乎非常灵活,但是在安全方面会引

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

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

  • 将事件映射到目标lambda并直接激发它。不同方法的区别在于,在本例中,我并不是真的在S3上创建文件,我只是让S3相信这一点。我将使用CloudWatch触发自定义S3对象创建的事件,事件的名称为lambda要拾取的文件夹。这种方法比其他两种方法感觉有点粗糙,另外,当我对这个问题进行研究时,似乎不可能在AWS上生成“模拟”事件(即)。然而,据我所知,函数
    put\u events
    应该起作用

  • 使用SQS将允许将文件夹名称放入SQS任务中,稍后lambda可以使用该任务。与其他两种方法相比,这有一些优势,因为SQS现在有一种后进先出的变体,它允许一次交付、故障再处理(通过死信队列)等,但是与其他方法相比,这产生了不小的复杂性

  • 在这一点上,我试图选择最“正确”的方法,并且 为了做到这一点,我试图权衡利弊,做出明智的决定,这让我产生了一些问题:

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

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


    我想你的问题可以归结为“在我将一个装满文件的文件夹上传到S3之后,如何触发Lambda函数?”

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

    我将考虑的备选方案:

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

  • 我喜欢第一种选择。它实现了最终目标,而不会产生无关的S3对象。使用SNS,如果需要,还可以配置多个下游进程以响应“完成上传”消息(扇出)。

    您是否考虑过使用S3桶事件的前缀选项,我测试了它,并且运行良好。在我的S3存储桶中,我创建了两个文件夹test1和test2。在s3事件中,我添加了前缀test1,每次在bucket lambda上执行put/copy操作时都会使用该前缀


    我不理解你关于方法1“在安全方面造成严重问题”的评论。为什么在文件夹上载结束时上载sentinel文件会比上载文件本身带来更多或更少的安全风险?因为sentinel文件将包含有关系统的信息,并从操作它的其他组件读取,所以文件注入是很有可能的。它提供了什么信息,给了谁?如果您可以读取sentinel对象,那么您大概也可以读取所有其他对象(它们提供了更多信息)。也许你可以分享更多关于“文件注入”风险的信息。你基本上是在陈述第1点和第3点,没有任何争论,你能扩展你的推理吗?你已经询问了关于如何实施通知工作流的意见。我已经提出了我的意见。没有“正确的方法”。你要么主动通知(选项1是一种方式),要么主动通知(选项2是一种方式)。我同意@jarmod的建议。必须发出某种信号,表明文件夹已准备好进行处理。这可以在S3外部完成(SNS、SQS或直接Lambda调用),也可以通过向S3上传Lambda检测和响应的“信号”文件来完成。无论哪种方式,都需要“发送”端有一些特殊的东西来触发动作。也可以通过一些计时机制选择“等待上传完成”(例如,在第一次上传后等待n分钟),并且不需要额外的“发送”信号,但可能存在难以调试的问题。“我更喜欢第一个选项。”是您的响应中唯一包含任何类型信息的部分。如果你不争辩,那么说出你的立场是没有意义的。你为什么更喜欢主动的方式而不是被动的方式?