

# 通过 Amazon S3 批处理事件调用 Lambda 函数
<a name="services-s3-batch"></a>

可以使用 Amazon S3 分批操作对一大组 Amazon S3 对象调用 Lambda 函数。Amazon S3 将跟踪批处理操作的进度，发送通知，并存储显示每个操作的状态的完成报告。

要运行分批操作，请创建 Amazon S3 [分批操作作业](https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-operations.html)。在创建作业时，您将提供清单（对象列表）并配置要对这些对象执行的操作。

在批处理作业启动时，Amazon S3 会为清单中的每个对象[同步](invocation-sync.md)调用 Lambda 函数。事件参数包含存储桶和对象的名称。

以下示例显示了对于 **amzn-s3-demo-bucket** 存储桶中名为 **customerImage1.jpg** 的对象，Amazon S3 发送到 Lambda 函数的事件。

**Example 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` 值。

**Example Amazon S3 批处理请求响应**  

```
{
  "invocationSchemaVersion": "1.0",
  "treatMissingKeysAs" : "PermanentFailure",
  "invocationId" : "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo",
  "results": [
    {
      "taskId": "dGFza2lkZ29lc2hlcmUK",
      "resultCode": "Succeeded",
      "resultString": "[\"Alice\", \"Bob\"]"
    }
  ]
}
```

## 从 Amazon S3 分批操作调用 Lambda 函数
<a name="invoking"></a>

您可以使用非限定的或限定的函数 ARN 调用 Lambda 函数。如果要对整个批处理作业使用同一函数版本，请在创建作业时在 `FunctionARN` 参数中配置特定的函数版本。在配置别名或 \$1LATEST 限定符的情况下，如果在作业执行期间更新别名或 \$1LATEST，则批处理作业会立即开始调用函数的新版本。

请注意，您不能对分批操作重用现有的 Amazon S3 的基于事件的函数。这是因为 Amazon S3 分批操作会将不同的事件参数传递给 Lambda 函数，并且需要一条带特定 JSON 结构的返回消息。

在为 Amazon S3 Batch Job 创建的[基于资源](access-control-resource-based.md)的策略中，请确保为任务设置调用 Lambda 函数的权限。

在函数的[执行角色](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-iam-role-policies.html)中，为 Amazon S3 设置一个信任策略以便它在运行函数时代入该角色。

如果您的函数使用AWS开发工具包来管理 Amazon S3 资源，则您需要在执行角色中添加 Amazon S3 权限。

在作业运行时，Amazon S3 会启动多个函数实例来并行处理 Amazon S3 对象，直至函数的[并发限制](lambda-concurrency.md)。Amazon S3 会限制实例的初始增加以避免较小作业的额外成本。

如果 Lambda 函数返回 `TemporaryFailure` 响应代码，则 Amazon S3 会重试操作。

有关 Amazon S3 分批操作的更多信息，请参阅 *Amazon S3 开发人员指南*中的[执行分批操作](https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops.html)。

有关如何在 Amazon S3 分批操作中使用 Lambda 函数的示例，请参阅*开发人员指南*中的[从 Amazon S3 分批操作调用 Lambda 函数](https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-invoke-lambda.html)。