【问题标题】:S3 Lambda Trigger not triggering for EVERY file uploadS3 Lambda 触发器不会为每个文件上传触发
【发布时间】:2021-10-10 21:20:34
【问题描述】:

在 Python Django 中,我保存了多个视频文件。

保存 1:

  • 长视频
  • 短视频

保存 2:

  • 长视频
  • 短视频

保存 3:

  • 长视频
  • 短视频

我有一个 lambda 触发器,它使用媒体转换器将 HLS 格式添加到这些视频以及生成缩略图。这 3 次保存是在彼此之间非常短的时间内完成的,因为它们是 Social Media Post 对象的资产。

出于某种原因,S3 仅针对某些文件触发。

Save 1 会触发 S3 Lambda,但不会触发 Save 2。 Save 3 也会触发 S3 Lambda。

我的假设是 S3 触发器在识别新文件上传之间存在某种停机时间(在这种情况下,我认为这些文件上传之间的时间段几乎是即时的)。

这个假设是否正确,我该如何规避它?

【问题讨论】:

    标签: django amazon-web-services amazon-s3 file-upload aws-lambda


    【解决方案1】:

    它应该为所有个对象触发。

    当 Amazon S3 触发 AWS Lambda 函数时,有关导致触发的对象的信息在 events 字段中传递:

    {
      "Records": [
        {
          "eventSource": "aws:s3",
          "awsRegion": "us-west-2",
          "eventTime": "1970-01-01T00:00:00.000Z",
          "eventName": "ObjectCreated:Put",
          "s3": {
            "bucket": {
              "name": "my-s3-bucket",
              "arn": "arn:aws:s3:::example-bucket"
            },
            "object": {
              "key": "HappyFace.jpg",
              "size": 1024,
              ...
            }
          }
        }
      ]
    }
    

    请注意,这是一个数组,因此可以将多个对象传递给一个 Lambda 函数。我从未明确地看到这种情况发生,但来自 AWS 的示例代码肯定会根据他们的示例代码假设这可能发生:

    def lambda_handler(event, context):
      for record in event['Records']:   # <-- Looping here
          bucket = record['s3']['bucket']['name']
          key = unquote_plus(record['s3']['object']['key'])
          ...
    

    因此,我会建议:

    • 在函数开始处打印event,以将其放入日志以供以后检查
    • 使用循环遍历所有可能通过的记录
    • 让我们知道您发现了什么!

    【讨论】:

    • 你太棒了!确实有多个文件一次发送到 lambda,我必须遍历每条记录。我应该更深入地研究这个的 Lambda 文档。谢谢!
    猜你喜欢
    • 2021-08-27
    • 2020-05-16
    • 2023-03-18
    • 1970-01-01
    • 2020-02-09
    • 2019-08-03
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多