Amazon web services 在预签名URL过期时触发事件

Amazon web services 在预签名URL过期时触发事件,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,下面是创建对象时的事件通知示例: s3EventObjectCreated: handler: src/handlers/postProcess events: - s3: bucket: 'bucketName' event: s3:ObjectCreated:* rules: - prefix: 'files/' existing: true 如何在预签名UR

下面是创建对象时的事件通知示例:

s3EventObjectCreated:
    handler: src/handlers/postProcess
    events:
      - s3:
          bucket: 'bucketName'
          event: s3:ObjectCreated:*
          rules:
            - prefix: 'files/'
          existing: true
如何在预签名URL过期时创建事件通知


因此,如果预签名URL过期,它将触发一个事件并调用my lambda函数。

预签名URL在客户端生成,不涉及Amazon S3。生成预签名URL时,将使用提供的凭据创建在一定时间内有效的签名。此签名可用于以后提出请求。在发出实际请求时,AWS检查签名是否使用授权凭据进行,以及签名是否仍然有效

因为签名是在客户端生成的,所以一旦签名过期,就不能让AWS触发任何东西


要在预签名URL过期时触发操作,您需要一些额外的逻辑。例如,您可以确保在DynamoDB中为每个预签名的URL存储一个项,并在预签名的URL过期后,根据从DynamoDB中删除该项所导致的DynamoDB流事件,使用该项触发Lambda函数。

您不能。根据,AWS S3仅发布以下事件的通知:

  • 事件创建的新对象
  • 对象删除事件
  • 还原对象事件
  • 减少冗余存储(RRS)对象丢失事件
似乎您希望在S3预签名url过期时执行lambda。有一个工作机会。我打赌你的S3URL必须有一个预先配置的到期时间

  • 如果到期时间小于或等于15分钟,则可以使用SQS延迟队列。每当生成S3URL时,只要将消息推送到SQS,延迟时间为
    expiration\u time
    ,当消息在延迟时间后在SQS中可见时,它就会触发lambda

  • 如果您的有效期超过15分钟,您可以考虑购买。或者,您可以使用编写自己的调度程序,并在作业执行时触发lambda


  • 如果您希望在预签名url过期时触发事件,例如,如果有人试图使用过期的已签名url从S3 bucket获取对象,则有两种方法

    反应方式:(首选)

    当使用过期URL时,AWS S3将生成一个4XX或5XX错误。您可以使用cloudtrail/服务器访问日志来确定错误是由过期的SifnedURL引起的,并且您可以配置一个Lambda函数,该函数可以在使用过期SignedURL时触发

    主动方式:

    正如其他答案中提到的,您需要配置机制来跟踪SignedURL生成和过期之间的时间。但是,如果生成数以百万计的SIgnedURL,那么主动式方法将存在可伸缩性问题

    希望这有帮助,
    谢谢

    虽然我理解你的意思,但实际上触发Lambda函数的并不是DynamoDB的TTL功能。每当某个项过期时,它都会向DynamoDB流发送一个类型为
    REMOVE
    的事件,然后该事件可能会被Lambda函数使用。我知道你知道这一点,但我只是指出这一点,因为这可能会让不理解这个概念的用户感到困惑。谢谢,编辑。现在我想起来了,这可能不是最好的解决方案,因为AWS不能保证及时删除DynamoDB中TTL过期的项目。是的,但我自己想不出其他任何东西。最初我会采用相同的解决方案。延迟队列也可以用于短期预签名URL(最多15分钟)。无论如何,我怀疑它是否需要是一个实时的东西,OP可能只是想看到一个仪表板/未使用的URL列表。我还是会同意你的解决方案。我能问一下。。。您为什么希望收到此通知?也许有一种更好的方法可以设计不需要此类通知的应用程序。例如,您可以在需要时准确地生成预签名的URL,而不是保留它以供以后使用。如果您能告诉我们更多关于您的情况,我们将能够提供更好的建议。因此,工作流程应该是,在
    dynamoDB
    中生成预签名的URL并创建一个文档。客户端将使用预先签名的URL上传文档,如果成功,我需要在dynamo DB中更新文档。如果客户端未能在过期时间内上传文档(预签名URL已过期),我需要从dynamo DB中删除文档。定期删除处于“未执行”状态且超过某个时间段的所有文档可能是最简单的方法。或者,将过期时间添加到文档中,并使用该时间确定是否删除。@JohnRotenstein提出了一个很好的观点。此外,请记住,涉及预签名URL的请求只需要在URL过期之前启动,而不需要在。。。因此,如果上载在到期前立即开始,但在到期后完成,则需要注意一个竞争条件。如果在到期前开始上传,无论需要多长时间才能完成,上传都会成功。仅供参考,我们决定生成一个预签名URL,只有在上传完成后才能在dynamo DB中创建一个文档。因此,在某种程度上,我们不担心未使用的dynamo DB文档。