Skip to main content
AWS Lambda 是一项无服务器计算服务,允许您无需配置或管理服务器即可运行代码。 在本指南中,我们将使用 Dockerfile 将 Bun HTTP 服务器部署到 AWS Lambda。
继续之前,请确保您已经具备:
  • 一个准备好部署的 Bun 应用
  • 一个 AWS 账户
  • 已安装并配置好的 AWS CLI
  • 已安装并添加到 PATHDocker

1

创建一个新的 Dockerfile

确保您处于项目目录下,然后在项目根目录创建一个新的 Dockerfile。此文件包含初始化容器、将本地项目文件复制到容器、安装依赖以及启动应用的指令。
Dockerfile
# 使用官方 AWS Lambda 适配器镜像来处理 Lambda 运行时
FROM public.ecr.aws/awsguru/aws-lambda-adapter:0.9.0 AS aws-lambda-adapter

# 使用官方 Bun 镜像来运行应用
FROM oven/bun:debian AS bun_latest

# 将 Lambda 适配器复制到容器中
COPY --from=aws-lambda-adapter /lambda-adapter /opt/extensions/lambda-adapter

# 设置端口为 8080,AWS Lambda 适配器需要此端口
ENV PORT=8080

# 设置工作目录为 `/var/task`,这是 Lambda 的默认工作目录
WORKDIR "/var/task"

# 复制 package.json 和 bun.lock 到容器中
COPY package.json bun.lock ./

# 安装依赖
RUN bun install --production --frozen-lockfile

# 复制其余应用文件到容器中
COPY . /var/task

# 运行应用
CMD ["bun", "index.ts"]
确保启动命令对应您的应用入口点。如果您在 package.json 中有启动脚本,也可以使用 CMD ["bun", "run", "start"]该镜像会在容器内使用 Bun 安装依赖并运行您的应用。如果您的应用没有依赖,可以省略 RUN bun install --production --frozen-lockfile 这行。
在项目根目录创建一个新的 .dockerignore 文件,里面列出应从容器镜像中 排除 的文件或目录,例如 node_modules。这样可以让构建更快且更小:
.dockerignore
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# 任何其他想排除的文件或目录
2

构建 Docker 镜像

确保您处于包含 Dockerfile 的目录,然后构建 Docker 镜像。本例中,我们将镜像命名为 bun-lambda-demo,并标记为 latest
terminal
# cd /path/to/your/app
docker build --provenance=false --platform linux/amd64 -t bun-lambda-demo:latest .
3

创建 ECR 仓库

要将镜像推送到 AWS Lambda,首先需要创建一个 ECR 仓库运行以下命令将会:
  • us-east-1 区域创建一个名为 bun-lambda-demo 的 ECR 仓库
  • 获取仓库 URI,并将其导出为环境变量(可选,但便于接下来的步骤)
terminal
export ECR_URI=$(aws ecr create-repository --repository-name bun-lambda-demo --region us-east-1 --query 'repository.repositoryUri' --output text)
echo $ECR_URI
[id].dkr.ecr.us-east-1.amazonaws.com/bun-lambda-demo
如果您使用 IAM Identity Center (SSO) 或为 AWS CLI 配置了多个 profile,需要为 AWS CLI 命令添加 --profile 参数。例如,若您的 profile 名为 my-sso-app,则使用 --profile my-sso-app。您可通过 aws configure list-profiles 查看可用的 profile。
terminal
export ECR_URI=$(aws ecr create-repository --repository-name bun-lambda-demo --region us-east-1 --profile my-sso-app --query 'repository.repositoryUri' --output text)
echo $ECR_URI
4

认证登录 ECR 仓库

登录到 ECR 仓库:
terminal
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $ECR_URI
Login Succeeded
若使用 profile,需添加 --profile 参数:
terminal
aws ecr get-login-password --region us-east-1 --profile my-sso-app | docker login --username AWS --password-stdin $ECR_URI
5

为 Docker 镜像打标签并推送到 ECR 仓库

确保您处于包含 Dockerfile 的目录下,然后对 Docker 镜像使用 ECR 仓库的 URI 打标签。
terminal
docker tag bun-lambda-demo:latest ${ECR_URI}:latest
接着,将镜像推送到 ECR 仓库。
terminal
docker push ${ECR_URI}:latest
6

创建 AWS Lambda 函数

打开 AWS 控制台 > Lambda > 创建函数 > 选择 容器映像
请确认您选择了正确的区域,该链接默认为 us-east-1
创建函数
为函数命名,例如 my-bun-function
7

选择容器映像

然后,前往 容器映像 URI 部分,点击 浏览映像。选择刚才推送到 ECR 仓库的映像。
选择容器仓库
接着选择 latest 标签的映像,点击 选择映像
选择容器映像
8

配置函数

要获取函数的公共 URL,需要前往 附加配置 > 网络 > 函数 URL将其设置为 启用,认证类型选择 NONE
设置函数 URL
9

创建函数

点击页面底部的 创建函数,函数即被创建。
创建函数
10

获取函数 URL

函数创建完成后,您会被重定向到函数页面,在 “函数 URL” 部分可以看到函数的 URL。
函数 URL
11

测试函数

🥳 您的应用已上线!要测试函数,您可以前往 测试 标签页,或直接调用函数 URL。
terminal
curl -X GET https://[your-function-id].lambda-url.us-east-1.on.aws/
Hello from Bun on Lambda!