我需要一些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建议的那样引用第一个元素。
答案 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
。
也就是说,如果你仍然希望你的代码能够在每次调用时处理多个记录,那么将它写入以下任何一个都没有害处:
答案 1 :(得分:1)