Amazon S3 バッチイベントで Lambda 関数を呼び出す
Amazon S3 のバッチ操作を使用することで、大量の Amazon S3 オブジェクトに対して Lambda 関数を呼び出すことができます。Amazon S3 は、バッチオペレーションの進行状況を追跡して、通知を送信し、各アクションのステータスを示す完了レポートを保存します。
バッチ操作を実行するには、Amazon S3 バッチ操作ジョブを作成します。ジョブを作成するときは、マニフェスト (オブジェクトのリスト) を用意し、それらのオブジェクトに対して実行するアクションを設定します。
バッチジョブが開始されると、Amazon S3 はマニフェスト内の各オブジェクトに対して同期的に Lambda 関数を呼び出します。イベントパラメータには、バケットとオブジェクトの名前が含まれます。
以下の例では、Amazon S3 が amzn-s3-demo-bucket バケット内の customerImage1.jpg という名前のオブジェクトの 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 関数の呼び出し
Lambda 関数は、非修飾または修飾関数 ARN を使用して呼び出すことができます。バッチジョブ全体に同じ関数バージョンを使用する場合は、ジョブの作成時に FunctionARN
パラメータで特定の関数バージョンを構成します。エイリアスまたは $LATEST 修飾子を設定した場合、ジョブ実行中にエイリアスまたは $LATEST が更新されると、バッチジョブは新しいバージョンの関数の呼び出しをただちに開始します。
既存の Amazon S3 イベントベースの関数をバッチ操作に再利用することはできません。これは、Amazon S3 バッチ操作によって異なるイベントパラメータが Lambda 関数に渡され、特定の JSON 構造を持つリターンメッセージが期待されるためです。
Amazon S3 Batch Job 用に作成するリソースベースのポリシーで、Lambda 関数を呼び出すためのジョブに、アクセス許可が設定されていることを確認します。
関数の実行ロールで、Amazon S3 が関数の実行時にロールを引き受けるための信頼ポリシーを設定します。
関数で AWS SDK を使用して Amazon S3 リソースを管理する場合は、実行ロールに Amazon S3 のアクセス許可を追加する必要があります。
ジョブが実行されると、Amazon S3 は複数の関数インスタンスを起動して、関数の同時実行数の上限に達するまで Amazon S3 オブジェクトを並列処理します。Amazon S3 は、小規模なジョブでコストが高騰することを避けるため、インスタンスの初期ランプアップを制限します。
Lambda 関数が TemporaryFailure
レスポンスコードを返した場合、Amazon S3 はオペレーションを再試行します。
Amazon S3 バッチ操作の詳細については、Amazon S3 デベロッパーガイドの バッチ操作の実行を参照してください。
Amazon S3 バッチ操作で Lambda 関数を使用する方法の例については、Amazon S3デベロッパーガイドの Invoking a Lambda function from Amazon S3 batch operations を参照してください。