S3 put() 事件 lambda 触发器中可以有多少条记录?
How many records can be in S3 put() event lambda trigger?
我需要一些获得此流程的 lambda 函数:
Triggered S3 put file event -> lambda function -> insert row to 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 建议的那样引用第一个元素。
鉴于您当前的配置,您每次调用只会获得一条记录。这是因为每个不同的 S3 Put 事件都会触发一个不同的 S3 事件通知,您的 AWS Lambda 函数作为接收者。默认情况下,Lambda 最多可以处理 100 concurrent executions,这个限制可以根据您的传入事件率自动提高。
AWS Lambda 接收 Records
作为集合,因为它使用 S3 事件通知将事件发送到 lambda,因此使用 S3 notification event message structure. In anticipation of event types that may return more than one record, the format exists as a collection. You can see a full list of S3 event notification types here.
这不会影响 s3:ObjectCreated:Put
等事件的 S3 通知,因此您可以按原样保留该功能,因为这就是 Put 通知的工作方式 -- one event -> one notification -> one invokation
.
就是说,如果您仍然希望您的代码能够在每次调用时处理多个记录,那么将其写入其中任何一个都没有坏处:
- 循环处理记录(文档中有一个示例:python example deployment code that AWS provides 循环而不是仅获取第一条记录)。如果你走这条路,如果你的应用程序不能容忍它们,请考虑添加更多逻辑来过滤重复项。
- 在 >1 条记录上记录错误。
- 将文件上传到 S3 中的另一个新文件夹(可能带有时间戳)。
- 文件上传后,将包含上述文件夹路径的文件放入 S3 folder/bucket(触发 Lambda)。
- 现在将使用包含上传文件列表路径的文件的密钥触发 Lambda
我需要一些获得此流程的 lambda 函数:
Triggered S3 put file event -> lambda function -> insert row to 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 建议的那样引用第一个元素。
鉴于您当前的配置,您每次调用只会获得一条记录。这是因为每个不同的 S3 Put 事件都会触发一个不同的 S3 事件通知,您的 AWS Lambda 函数作为接收者。默认情况下,Lambda 最多可以处理 100 concurrent executions,这个限制可以根据您的传入事件率自动提高。
AWS Lambda 接收 Records
作为集合,因为它使用 S3 事件通知将事件发送到 lambda,因此使用 S3 notification event message structure. In anticipation of event types that may return more than one record, the format exists as a collection. You can see a full list of S3 event notification types here.
这不会影响 s3:ObjectCreated:Put
等事件的 S3 通知,因此您可以按原样保留该功能,因为这就是 Put 通知的工作方式 -- one event -> one notification -> one invokation
.
就是说,如果您仍然希望您的代码能够在每次调用时处理多个记录,那么将其写入其中任何一个都没有坏处:
- 循环处理记录(文档中有一个示例:python example deployment code that AWS provides 循环而不是仅获取第一条记录)。如果你走这条路,如果你的应用程序不能容忍它们,请考虑添加更多逻辑来过滤重复项。
- 在 >1 条记录上记录错误。
- 将文件上传到 S3 中的另一个新文件夹(可能带有时间戳)。
- 文件上传后,将包含上述文件夹路径的文件放入 S3 folder/bucket(触发 Lambda)。
- 现在将使用包含上传文件列表路径的文件的密钥触发 Lambda