S3 put()事件lambda触发器中可以有多少条记录?

时间:2016-11-23 13:21:47

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

我需要一些lambda函数来获得这个流程:

  

触发S3放置文件事件 - > lambda函数 - >将行插入DynamoDB

当我在lambda屏幕上使用AWS创建测试时,我在Records列表中只有1条记录得到了这个例子:

{
  "Records": [    //  <<<----------------only 1 element 
    {
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "s3": {
        "configurationId": "testConfigRule",
        "object": {
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901",
          "key": "HappyFace.jpg",
          "size": 1024
        },
        "bucket": {
          "arn": "arn:aws:s3:::mybucket",
          "name": "roeyg-oregon-s3-bucket",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          }
        },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
        "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
    }
  ]
}

我尝试了几种方法来查看是否可以在此列表中获得包含多个元素的列表,例如使用CLI或将多个文件一起上传甚至整个文件夹,在所有这些场景中,我每个项目都有一个项目一件事。

我的问题是要知道是否有一个场景我可以在一个事件中获得多个文件?

通过这种方式,我会将我的代码更改为循环,而不是像AWS建议的那样引用第一个元素。

2 个答案:

答案 0 :(得分:15)

根据您当前的配置,每次调用只能获得一条记录。这是因为每个不同的S3 Put Event都会以您的AWS Lambda函数作为收件人触发不同的S3事件通知。然后,Lambda默认情况下最多可以处理100 concurrent executions,这个限制可以根据您的传入事件率自动提升。

AWS Lambda接收Records作为集合,因为它使用S3事件通知将事件发送到lambda,从而使用S3 notification event message structure。在anticipation of event types that may return more than one record中,格式作为集合存在。您可以查看S3事件通知类型here的完整列表。

这不会影响来自s3:ObjectCreated:Put等事件的S3通知,因此您可以按原样保留该功能,因为这是Put通知的工作方式 - one event -> one notification -> one invokation

也就是说,如果你仍然希望你的代码能够在每次调用时处理多个记录,那么将它写入以下任何一个都没有害处:

  • 循环中的进程记录(文档中有一个示例:python example deployment code that AWS provides循环,而不是只抓取第一条记录)。如果您采用这种方法,如果您的应用程序无法容忍它们,请考虑添加更多逻辑来过滤重复项。
  • 在&gt; 1条记录上记录错误。

答案 1 :(得分:1)

  1. 在S3中将文件上传到其他新文件夹(可能带有时间戳)。
  2. 上传文件后,将包含上述文件夹路径的文件放入S3文件夹/存储桶(触发Lambda)。
  3. 现在将使用包含上载文件列表路径的文件的密钥触发Lambda