云计算与部署部署到 AWS Lambda

部署到 AWS Lambda

用容器镜像 + Lambda Web Adapter 让标准 Bun HTTP 服务接 Lambda 事件

最后更新于

你将得到什么

一个不改代码的 Bun.serve 服务,打包成容器镜像后在 Lambda 上运行。Lambda Web Adapter 作为扩展把 Lambda 事件转成普通 HTTP 请求,要求服务监听 8080

1. 服务保持普通 HTTP 形态

index.ts
const server = Bun.serve({
  port: Number(Bun.env.PORT ?? 8080),
  routes: {
    '/': () => new Response('Hello from Bun on Lambda!'),
  },
});

console.log(`Listening on ${server.url}`);

不要为 Lambda 改写事件处理函数;适配层负责事件转换。

2. Dockerfile

Dockerfile
FROM public.ecr.aws/awsguru/aws-lambda-adapter:0.9.0 AS aws-lambda-adapter
FROM oven/bun:debian

COPY --from=aws-lambda-adapter /lambda-adapter /opt/extensions/lambda-adapter

WORKDIR /var/task
COPY package.json bun.lock ./
RUN bun install --production --frozen-lockfile
COPY index.ts ./

ENV PORT=8080
CMD ["bun", "index.ts"]

配套 .dockerignorenode_modules.git.envcoverage 等。固定经过验证的 adapter 与 Bun 镜像版本或 digest。

3. 构建并推送 ECR

docker build --provenance=false --platform linux/amd64 -t bun-lambda-demo:latest .

aws ecr create-repository --repository-name bun-lambda-demo
aws ecr get-login-password | docker login --username AWS --password-stdin <ECR_URI>

docker tag bun-lambda-demo:latest <ECR_URI>/bun-lambda-demo:latest
docker push <ECR_URI>/bun-lambda-demo:latest

--platform linux/amd64 保证在 Apple Silicon 上也产出与 Lambda 一致的架构;如函数选 arm64 则对应调整。

4. 创建函数

  1. Lambda 控制台选择 Container image 创建函数,选中刚推送的 ECR 镜像;
  2. 需要公网测试时在函数配置里开启 Function URL,Auth Type 选 NONE
  3. curl 函数 URL,预期返回 Hello from Bun on Lambda!

Auth Type NONE 是公开端点

NONE 只适合演示。生产函数使用 AWS_IAM 或在 URL 后接自有鉴权;公开端点还要评估限流、成本和滥用面。

边界

  • 本页只覆盖官方指南的容器 + Web Adapter 路径,不含 provided.al2023 custom runtime。
  • Lambda 仍是事件模型:快照外的本地磁盘、后台任务和长连接不保证存在;WebSocket 不走这条路径。
  • 超时、内存和并发按函数配置;AI 流式请求同时受 Lambda 上限与 Bun.serve idleTimeout 约束,见 Serverless 与边缘
  • 冷启动要在目标内存配置上实测;容器镜像大小直接影响它。

验收

  1. Function URL 返回预期响应,日志无 adapter 启动错误;
  2. 冷启动与 p95 延迟在目标内存下达标;
  3. 镜像固定版本/digest,CI 可复现构建;
  4. 生产函数不暴露 NONE 鉴权的公网 URL。

官方参考:Bun on AWS LambdaAWS Lambda Web Adapter