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!