AWS Lambda 是一种无服务器计算服务,让你无需预置或管理服务器即可运行代码。
在本指南中,我们将使用 Dockerfile 将 Bun HTTP 服务器部署到 AWS Lambda。
创建新的 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"]NOTE
确保启动命令对应于你的应用程序的入口点。如果你在 `package.json` 中有启动脚本,这也可以是 `CMD ["bun", "run", "start"]`。此镜像在容器内使用 Bun 安装依赖项并运行你的应用程序。如果你的应用程序没有依赖项,你可以省略 RUN bun install --production --frozen-lockfile 行。
在项目根目录创建一个新的 .dockerignore 文件。此文件包含应从容器镜像中排除的文件和目录,例如 node_modules。这会使你的构建更快、更小:
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# 任何其他你想要排除的文件或目录构建 Docker 镜像
确保你在包含 Dockerfile 的目录中,然后构建 Docker 镜像。在这种情况下,我们将镜像命名为 bun-lambda-demo 并标记为 latest。
# cd /path/to/your/app
docker build --provenance=false --platform linux/amd64 -t bun-lambda-demo:latest .创建 ECR 仓库
要将镜像推送到 AWS Lambda,我们首先需要创建一个 ECR 仓库 来推送镜像。
通过运行以下命令,我们:
- 在
us-east-1区域创建一个名为bun-lambda-demo的 ECR 仓库 - 获取仓库 URI,并将仓库 URI 导出为环境变量。这是可选的,但会使后续步骤更容易。
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-demoNOTE
如果你正在使用 IAM Identity Center (SSO) 或使用配置文件配置了 AWS CLI,你需要在 AWS CLI 命令中添加 `--profile` 标志。例如,如果你的配置文件名为 my-sso-app,请使用 --profile my-sso-app。使用 aws configure list-profiles 检查你的 AWS CLI 配置以查看可用的配置文件。
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使用 ECR 仓库进行身份验证
登录到 ECR 仓库:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $ECR_URILogin SucceededNOTE
如果使用配置文件,请使用 `--profile` 标志:aws ecr get-login-password --region us-east-1 --profile my-sso-app | docker login --username AWS --password-stdin $ECR_URI标记并将 Docker 镜像推送到 ECR 仓库
确保你在包含 Dockerfile 的目录中,然后使用 ECR 仓库 URI 标记 Docker 镜像。
docker tag bun-lambda-demo:latest ${ECR_URI}:latest然后,将镜像推送到 ECR 仓库。
docker push ${ECR_URI}:latest创建 AWS Lambda 函数
前往 AWS 控制台 > Lambda > 创建函数 > 选择 容器镜像

给函数一个名称,例如 my-bun-function。
选择容器镜像
然后,前往 容器镜像 URI 部分,点击 浏览镜像。选择我们刚刚推送到 ECR 仓库的镜像。

然后,选择 latest 镜像,点击 选择镜像。

配置函数
要获取函数的公共 URL,我们需要前往 其他配置 > 网络 > 函数 URL。
将其设置为 启用,身份验证类型为 NONE。

创建函数
点击页面底部的 创建函数,这将创建函数。

获取函数 URL
创建函数后,你将被重定向到函数页面,在那里你可以在 "函数 URL" 部分看到函数 URL。

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