云计算与部署部署到 AWS Lambda
部署到 AWS Lambda
用容器镜像 + Lambda Web Adapter 让标准 Bun HTTP 服务接 Lambda 事件
最后更新于
你将得到什么
一个不改代码的 Bun.serve 服务,打包成容器镜像后在 Lambda 上运行。Lambda Web Adapter 作为扩展把 Lambda 事件转成普通 HTTP 请求,要求服务监听 8080。
1. 服务保持普通 HTTP 形态
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
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"]配套 .dockerignore:node_modules、.git、.env、coverage 等。固定经过验证的 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. 创建函数
- Lambda 控制台选择 Container image 创建函数,选中刚推送的 ECR 镜像;
- 需要公网测试时在函数配置里开启 Function URL,Auth Type 选
NONE; curl函数 URL,预期返回Hello from Bun on Lambda!。
Auth Type NONE 是公开端点
NONE 只适合演示。生产函数使用 AWS_IAM 或在 URL 后接自有鉴权;公开端点还要评估限流、成本和滥用面。
边界
- 本页只覆盖官方指南的容器 + Web Adapter 路径,不含
provided.al2023custom runtime。 - Lambda 仍是事件模型:快照外的本地磁盘、后台任务和长连接不保证存在;WebSocket 不走这条路径。
- 超时、内存和并发按函数配置;AI 流式请求同时受 Lambda 上限与
Bun.serveidleTimeout约束,见 Serverless 与边缘。 - 冷启动要在目标内存配置上实测;容器镜像大小直接影响它。
验收
- Function URL 返回预期响应,日志无 adapter 启动错误;
- 冷启动与 p95 延迟在目标内存下达标;
- 镜像固定版本/digest,CI 可复现构建;
- 生产函数不暴露
NONE鉴权的公网 URL。