通过 Amazon S3 批处理事件调用 Lambda 函数
可以使用 Amazon S3 分批操作对一大组 Amazon S3 对象调用 Lambda 函数。Amazon S3 将跟踪批处理操作的进度,发送通知,并存储显示每个操作的状态的完成报告。
要运行分批操作,请创建 Amazon S3 分批操作作业。在创建作业时,您将提供清单(对象列表)并配置要对这些对象执行的操作。
在批处理作业启动时,Amazon S3 会为清单中的每个对象同步调用 Lambda 函数。事件参数包含存储桶和对象的名称。
以下示例显示了对于 amzn-s3-demo-bucket 存储桶中名为 customerImage1.jpg 的对象,Amazon S3 发送到 Lambda 函数的事件。
例 Amazon S3 批处理请求事件
{ "invocationSchemaVersion": "1.0", "invocationId": "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo", "job": { "id": "f3cc4f60-61f6-4a2b-8a21-d07600c373ce" }, "tasks": [ { "taskId": "dGFza2lkZ29lc2hlcmUK", "s3Key": "customerImage1.jpg", "s3VersionId": "1", "s3BucketArn": "arn:aws:s3:::amzn-s3-demo-bucket" } ] }
您的 Lambda 函数必须返回带字段的 JSON 对象,如以下示例所示。您可以从事件参数复制 invocationId
和 taskId
。您可以在 resultString
内返回一个字符串。Amazon S3 会保存完成报告中的 resultString
值。
例 Amazon S3 批处理请求响应
{ "invocationSchemaVersion": "1.0", "treatMissingKeysAs" : "PermanentFailure", "invocationId" : "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo", "results": [ { "taskId": "dGFza2lkZ29lc2hlcmUK", "resultCode": "Succeeded", "resultString": "[\"Alice\", \"Bob\"]" } ] }
从 Amazon S3 分批操作调用 Lambda 函数
您可以使用非限定的或限定的函数 ARN 调用 Lambda 函数。如果要对整个批处理作业使用同一函数版本,请在创建作业时在 FunctionARN
参数中配置特定的函数版本。在配置别名或 $LATEST 限定符的情况下,如果在作业执行期间更新别名或 $LATEST,则批处理作业会立即开始调用函数的新版本。
请注意,您不能对分批操作重用现有的 Amazon S3 的基于事件的函数。这是因为 Amazon S3 分批操作会将不同的事件参数传递给 Lambda 函数,并且需要一条带特定 JSON 结构的返回消息。
在为 Amazon S3 Batch Job 创建的基于资源的策略中,请确保为任务设置调用 Lambda 函数的权限。
在函数的执行角色中,为 Amazon S3 设置一个信任策略以便它在运行函数时代入该角色。
如果您的函数使用AWS开发工具包来管理 Amazon S3 资源,则您需要在执行角色中添加 Amazon S3 权限。
在作业运行时,Amazon S3 会启动多个函数实例来并行处理 Amazon S3 对象,直至函数的并发限制。Amazon S3 会限制实例的初始增加以避免较小作业的额外成本。
如果 Lambda 函数返回 TemporaryFailure
响应代码,则 Amazon S3 会重试操作。
有关 Amazon S3 分批操作的更多信息,请参阅 Amazon S3 开发人员指南中的执行分批操作。
有关如何在 Amazon S3 分批操作中使用 Lambda 函数的示例,请参阅开发人员指南中的从 Amazon S3 分批操作调用 Lambda 函数。