@effect-aws/lambda
Clean way to write AWS Lambda handlers using Effect.

It provides a makeLambda
function that takes an EffectHandler
and returns a native promise Lambda handler function.
The implementation supports defining global runtime layer with graceful shutdown. So all finalizers defined by acquireRelease
will be called on lambda downscaling.
Installation
npm install --save @effect-aws/lambda
Usage
Without dependencies:
import type { SNSEvent } from "aws-lambda"
import { Effect } from "effect"
import { EffectHandler, makeLambda } from "@effect-aws/lambda"
const myEffectHandler: EffectHandler<SNSEvent, never> = (event, context) => {
return Effect.succeed("Hello, World!")
}
export const handler = makeLambda(myEffectHandler)
With dependencies:
import { EffectHandler, makeLambda } from "@effect-aws/lambda"
import * as Logger from "@effect-aws/powertools-logger"
import type { SNSEvent } from "aws-lambda"
import { Context, Effect, Layer } from "effect"
interface FooService {
bar: () => Effect.Effect<never, never, void>
}
const FooService = Context.Tag<FooService>()
const FooServiceLive = Layer.succeed(
FooService,
FooService.of({ bar: () => Logger.logInfo("Not implemented") })
)
const myEffectHandler: EffectHandler<SNSEvent, FooService> = (event, context) =>
Effect.gen(function* () {
yield* Logger.logInfo("Received event", { event, context })
const service = yield* FooService
return yield* service.bar()
})
const LambdaLive = Layer.provideMerge(
FooServiceLive,
Logger.DefaultPowerToolsLoggerLayer
)
export const handler = makeLambda(myEffectHandler, LambdaLive)