昨天只是部署一個簡單的容器測試,
今天我們要做的,是把 Docker 化的 Todo API 實際推上 ECS Fargate,
並讓它成為一個可以被全世界訪問的 API 服務 🌍。
✅ 將 Docker image 推上 ECR
✅ 讓 ECS Fargate 執行 Todo API
✅ 設定環境變數(包含 DATABASE_URL)
✅ 驗證 API 成功回應
進入 AWS Console → ECR
確定有看到你的 repository,例如:
Repository: ts-todo-api
URI: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ts-todo-api
Tag: latest
如果沒有,請重新 push 一次:
docker build -t ts-todo-api .
docker tag ts-todo-api:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ts-todo-api:latest
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ts-todo-api:latest
進入 ECS Console → Task definitions → Create new task definition
選擇 Fargate。
設定如下:
基本設定
todo-api-task
ecsTaskExecutionRole
awsvpc
Container 設定
todo-api
你的 ECR image
Environment Variables
NODE_ENV=production
DATABASE_URL=postgresql://postgres:password@your-rds-endpoint:5432/todo
(⚠️ 如果 RDS 尚未建立,這裡可暫時放假的連線字串,後面會補上)
資源設定
點「Create」。
1️⃣ 回到 ECS → 選擇剛建立的 Cluster(todo-cluster)
2️⃣ 點「Create」 → 選擇 Service
3️⃣ 基本設定:
todo-api-task
todo-api-service
建立後,ECS 會自動啟動你的容器 🚀
在 ECS 介面中,點進 todo-cluster → Services → Tasks
應該會看到:
Last status: RUNNING
Desired status: RUNNING
點進去看「Public IP」,
這就是你 API 的外部連線位址。
複製 Public IP,測試:
curl http://<Public-IP>:3000/health
應該會看到:
{ "status": "ok" }
或者在瀏覽器輸入:
http://<Public-IP>:3000/todos
(如果你本地有連線資料庫並打包進 Docker,這邊也能查到資料)
🎉 你的 Todo API 現在正式「跑在雲端」了!
進入 AWS Console → CloudWatch → Logs → Log groups
找到名稱類似:
/ecs/todo-api-task
點進去可以看到容器輸出的 Log:
🚀 Todo API running on port 3000
Database connected successfully
如果看到這兩行,代表 ECS + Prisma 都運作正常 💪
| 問題 | 原因 | 解法 |
|---|---|---|
| 無法連線到 API | Security Group 沒開 3000 port | 修改 SG → Inbound 開 TCP 3000 |
| 任務狀態變 STOPPED | DATABASE_URL 錯誤或 image 拉取失敗 | 檢查 Logs 或 ECR image URI |
| CannotPullContainerError | IAM Role 沒有 ECR 權限 | 確保有附加 AmazonECSTaskExecutionRolePolicy |
| 502 Bad Gateway | Service 未綁定 Public IP 或 ALB 未配置 | 檢查網路設定是否是 public subnet |
部署完成後,現在你的架構長這樣👇
[User] → http://<Public-IP>:3000
↓
[ECS Fargate Service]
↓
[Docker Container] → Express/TS + Prisma
↓
[AWS RDS PostgreSQL] (Day 40 整合)
容器由 ECS 全自動管理,
不需開 EC2、不需手動維運,
AWS 會幫你處理 CPU、記憶體、重啟等細節。
今天算是整個部署歷程中「最有成就感」的一天。
因為我第一次在 AWS 上看到自己的 API 在雲端回應請求。
以前的部署流程要 SSH、手動啟服務、設定 nginx;
現在只要幾個步驟:
推 image → 建 task → 建 service → 成功上線 🎉
我學到三件事: