S3 Batch

AWS Documentation

Example

import middy from '@middy/core'
import eventNormalizerMiddleware from '@middy/event-normalizer'
import eventBatchResponse from '@middy/event-batch-response'
import eventBatchHandler from '@middy/event-batch-handler'

const recordHandler = async (task, context) => {
  // process task.s3Key; return a string for resultString,
  // or { resultCode, resultString } to choose Succeeded / TemporaryFailure / PermanentFailure;
  // throw to mark the task as TemporaryFailure
}
const lambdaHandler = eventBatchHandler(recordHandler)

export const handler = middy()
  .use(eventNormalizerMiddleware())
  .use(eventBatchResponse())
  .handler(lambdaHandler)

With Durable Functions

S3 Batch tasks often involve expensive multi-step work (download, transform, upload). When the Lambda hits the 15-minute timeout or transient failures, durable replay lets each task — and each step within a task — resume from its last checkpoint instead of redoing completed S3 reads/writes.

import { withDurableExecution } from '@aws/durable-execution-sdk-js'
import middy from '@middy/core'
import eventNormalizerMiddleware from '@middy/event-normalizer'
import eventBatchResponse from '@middy/event-batch-response'
import eventBatchHandler from '@middy/event-batch-handler'

const recordHandler = async (task, ctx) => {
  const object = await ctx.step('download', async () => s3.getObject(task.s3Key))
  const transformed = await ctx.step('transform', async () => transform(object))
  await ctx.step('upload', async () => s3.putObject(`${task.s3Key}.out`, transformed))
  return `transformed ${task.s3Key}` // → resultCode: "Succeeded"
}
const lambdaHandler = eventBatchHandler(recordHandler)

export const handler = withDurableExecution(
  middy()
    .use(eventNormalizerMiddleware())
    .use(eventBatchResponse())
    .handler(lambdaHandler)
)

Last updated: