

# 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 関数を呼び出します。イベントパラメータには、バケットとオブジェクトの名前が含まれます。

以下の例では、Amazon S3 が **amzn-s3-demo-bucket** バケット内の **customerImage1.jpg** という名前のオブジェクトの 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>

Lambda 関数は、非修飾または修飾関数 ARN を使用して呼び出すことができます。バッチジョブ全体に同じ関数バージョンを使用する場合は、ジョブの作成時に `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 SDK を使用して Amazon S3 リソースを管理する場合は、実行ロールに Amazon S3 のアクセス許可を追加する必要があります。

ジョブが実行されると、Amazon S3 は複数の関数インスタンスを起動して、関数の[同時実行数の上限](lambda-concurrency.md)に達するまで Amazon S3 オブジェクトを並列処理します。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デベロッパーガイド*の [Invoking a Lambda function from Amazon S3 batch operations](https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-invoke-lambda.html) を参照してください。