@effect-aws/lambda

中文文档
2.1.0发布于 2026/11/01MITTypeScriptES Module零依赖近 30 天下载 13.3万

有效的 AWS Lambda 处理器

中文使用文档
文档目录4 节
  1. 安装
  2. 使用量
  3. Lambda 网络函数
  4. Lambda 事件函数

@ effect-aws/ lambda (英语)

使用 WS Lambda 事件函数处理器和 Web 函数服务器的清洁写法 效果。 。 。 .

npm version npm downloads

它提供了一个 LambdaHandler.make 函数 EffectHandler 并返回本地承诺的 Lambda 处理器功能.

实施支持用优雅的关闭来界定全球运行时间层。 最终结果 acquireRelease 在收到关机信号后运行,但须遵守Lambda的清理期限。 在所有失败模式中,光荣的关闭并不得到保证.

安装

npm install --save @effect-aws/lambda

使用量

Lambda 网络函数

Lambda 网络函数 运行正常的 HTTP 服务器。 使用 LambdaWebFunction.layer 带有效果的 HttpRouter 或者说 HttpApi 听Lambda提供的地址:

npm install @effect-aws/lambda effect @effect/platform-node @effect/platform-node-shared
import * as LambdaWebFunction from "@effect-aws/lambda/LambdaWebFunction"
import { NodeRuntime } from "@effect/platform-node"
import { Effect, Layer } from "effect"
import { HttpRouter, HttpServerResponse } from "effect/http"

const Routes = HttpRouter.use((router) =>
  router.add("GET", "/", Effect.succeed(HttpServerResponse.text("Hello from Lambda Web Functions!")))
)

HttpRouter.serve(Routes).pipe(
  Layer.provide(LambdaWebFunction.layer),
  Layer.launch,
  NodeRuntime.runMain
)

给第一个API,通过你的 HttpApiBuilder.layer(...) 及其处理层 HttpRouter.serve 替换 Routes。服务器支持正常的HTTP响应流和并行请求。 在Effect 的请求上下文中保持特定请求状态,而不是共享可变全局.

Web 函数支持通过 @effect-aws/lambda/LambdaWebFunction 子路径。 它需要可选的 @effect/platform-node 端点依赖和相容效果版本( X)@effect/[email protected] 需求 effect@^4.0.0) (中文(简体) ). 现有事件函数用户可以继续从 @effect-aws/lambda 不安装 @effect/platform-node。 。 。 .

LambdaWebFunction.endpoint 读取和验证 AWS_LAMBDA_HTTP_ENDPOINT 使用效果 ConfigProvider失败 ConfigError;没有隐含的收听地址倒置. 指定本地运行 :

AWS_LAMBDA_HTTP_ENDPOINT=127.0.0.1:3000 node index.js

编译或捆绑您的切入点 index.js ,包括运行时间依赖。 关于无害环境管理的产出,包括a package.json 与 "type": "module". Web函数在发射时使用Arm64上的Node.js 24. 与网络函数驱动的 AWS CLI 一起部署已准备的目录 :

aws lambda-web deploy --name my-effect-app --code ./dist

Lambda在制作中提供监听地址. 服务器必须在10秒内开始监听. NodeRuntime.runMain 手柄 SIGTERM 并关闭地层范围; 帮助器将 HTTP 请求排出至 500 毫秒, 在 Lambda 的一秒清理窗口内为其他最后敲定者留下时间 。 清净还作是念已.

Web 函数不使用导出 Lambda 事件处理器, 函数 URL RESPONSE_STREAM 配置,或 LambdaHandler.context()。它们的管理 API 属于单独的 @aws-sdk/client-lambda-web SDK软件包,不需要服务HTTP请求.

Lambda 事件函数

LambdaHandler.make, (中文(简体) ), LambdaHandler.fromHttpApi,以及目标事件函数下方的流出适配器,包括API Gateway集成和Lambda函数 URL.

无依赖性 :

import { Effect } from "effect"
import { EffectHandler, LambdaHandler, SNSEvent } from "@effect-aws/lambda"

// Define your effect handler
const myEffectHandler: EffectHandler<SNSEvent, never> = (event, context) => {
  // Your effect logic here
  return Effect.succeed("Hello, World!")
}

// Create the Lambda handler
export const handler = LambdaHandler.make(myEffectHandler)

有依赖关系的:

import { EffectHandler, LambdaHandler, SNSEvent } from "@effect-aws/lambda"
import * as Logger from "@effect-aws/powertools-logger"
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") })
)

// Define your effect handler with dependencies
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()
  })

// Create the global layer
const LambdaLive = Layer.provideMerge(
  FooServiceLive,
  Logger.DefaultPowerToolsLoggerLayer
)

// Create the Lambda handler
export const handler = LambdaHandler.make({
  handler: myEffectHandler,
  layer: LambdaLive
})

流线 :

import { S3 } from "@effect-aws/client-s3"
import { Handler, LambdaHandler } from "@effect-aws/lambda"
import { NodeStream } from "@effect/platform-node"
import { Cause, Effect, Stream } from "effect"
import { Readable } from "node:stream"
import { createGzip } from "node:zlib"

/**
 * Streaming handler that reads a file from S3, compresses it using gzip, and
 * returns the compressed data as a stream.
 */
const streamHandler = () => {
  const stream = S3.getObject({
    Bucket: "example-bucket",
    Key: "file.txt"
  }).pipe(
    Effect.map((result) =>
      NodeStream.fromReadable(
        () => result.Body as Readable,
        (e) => new Cause.UnknownException(e)
      )
    ),
    Stream.unwrap
  )

  return stream.pipe(
    Stream.pipeThroughChannelOrFail(
      NodeStream.fromDuplex(
        () => createGzip(),
        (e) => new Cause.UnknownException(e)
      )
    )
  )
}

export const handler: Handler = LambdaHandler.stream({
  handler: streamHandler,
  layer: S3.defaultLayer
})

HttpApi 有 Lambda 函数 URL 的流线:

import { LambdaHandler } from "@effect-aws/lambda"
import {
  HttpApi,
  HttpApiBuilder,
  HttpApiEndpoint,
  HttpApiGroup,
  HttpApiSchema,
  HttpServer,
  HttpServerResponse
} from "@effect/platform"
import { Effect, Layer, Stream } from "effect"

const encoder = new TextEncoder()

const streamEndpoint = HttpApiEndpoint.get("stream")`/stream`.addSuccess(
  HttpApiSchema.Text()
)
const pingEndpoint = HttpApiEndpoint.get("ping")`/ping`.addSuccess(
  HttpApiSchema.Text()
)

const group = HttpApiGroup.make("api").add(streamEndpoint).add(pingEndpoint)
const api = HttpApi.make("Api").add(group)

const routes = HttpApiBuilder.group(api, "api", (handlers) =>
  handlers
    .handle("ping", () => Effect.succeed("pong\n"))
    .handleRaw("stream", () =>
      Effect.succeed(
        HttpServerResponse.stream(
          Stream.fromIterable(["chunk 1\n", "chunk 2\n", "done\n"]).pipe(
            Stream.map((chunk) => encoder.encode(chunk))
          ),
          { contentType: "text/plain; charset=utf-8" }
        )
      )
    )
)

const apiLive = HttpApiBuilder.api(api).pipe(Layer.provide(routes))

export const handler = LambdaHandler.streamFromHttpApi(
  Layer.mergeAll(apiLive, HttpServer.layerContext)
)

使用 handle 用于正常的策略反应和 handleRaw 用于流线 HttpServerResponse 数值。 必须通过 Lambda 函数 URL 引用 Lambda 并启用响应流 InvokeMode: RESPONSE_STREAM. API Gateway HTTP API集成不支持Lambda响应流.

版本与发布记录

@effect-aws/lambda 共发布 25 个版本,首次发布于 2024/01/29;过去 12 个月发布了 11 个版本。

版本发布日期距今
2.1.0latest2026/11/0112 天前
2.0.02026/10/021 个月前
2.0.0-beta.5beta2026/06/045 个月前
1.7.02026/06/045 个月前
2.0.0-beta.42026/04/156 个月前
2.0.0-beta.32026/03/128 个月前

关于 @effect-aws/lambda 的常见问题

@effect-aws/lambda 是什么?

有效的 AWS Lambda 处理器

如何安装 @effect-aws/lambda?

在项目目录运行 npm install @effect-aws/lambda,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:effect(>=4.0.0-beta.66 <5.0.0)、@effect/platform-node-shared(>=4.0.0 <5.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@effect-aws/lambda 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@effect-aws/lambda 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@effect-aws/lambda 可以商用吗?

@effect-aws/lambda 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@effect-aws/lambda 的下载量有多少?

根据 npm 官方下载统计,@effect-aws/lambda 在 2026/10/13 – 2026/11/11 这 30 天内被下载 133,022 次,日均约 4,434 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@effect-aws/lambda 还在维护吗?

最新版本 2.1.0 发布于 2026/11/01(12 天前);至今共发布 25 个版本,其中过去 12 个月发布了 11 个;首次发布于 2024/01/29。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。