iT邦幫忙

2025 iThome 鐵人賽

0
自我挑戰組

《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》系列 第 39

Day39 - 持續成長學習藍圖 - AWS 與 ECS(讓 Todo API 跑上 ECS_整合 Fargate)

  • 分享至 

  • xImage
  •  

昨天只是部署一個簡單的容器測試,
今天我們要做的,是把 Docker 化的 Todo API 實際推上 ECS Fargate,
並讓它成為一個可以被全世界訪問的 API 服務 🌍。


🎯 今日目標

✅ 將 Docker image 推上 ECR
✅ 讓 ECS Fargate 執行 Todo API
✅ 設定環境變數(包含 DATABASE_URL)
✅ 驗證 API 成功回應


☁️ Step 1:確認映像已在 ECR

進入 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

🧱 Step 2:建立 Fargate Task Definition(正式版)

進入 ECS Console → Task definitions → Create new task definition
選擇 Fargate

設定如下:

基本設定

  • Task name: todo-api-task
  • Task role: ecsTaskExecutionRole
  • Network mode: awsvpc

Container 設定

  • Container name: todo-api
  • Image URI: 你的 ECR image
  • Port mappings: 3000 → TCP
  • Log configuration: 啟用 CloudWatch Logs

Environment Variables

  • NODE_ENV=production
  • DATABASE_URL=postgresql://postgres:password@your-rds-endpoint:5432/todo

(⚠️ 如果 RDS 尚未建立,這裡可暫時放假的連線字串,後面會補上)

資源設定

  • CPU: 256
  • Memory: 512

點「Create」。


🚀 Step 3:建立 ECS Service(正式運行)

1️⃣ 回到 ECS → 選擇剛建立的 Cluster(todo-cluster
2️⃣ 點「Create」 → 選擇 Service
3️⃣ 基本設定:

  • Launch type:Fargate
  • Task definition:todo-api-task
  • Service name:todo-api-service
  • Desired tasks:1
    4️⃣ 網路設定:
  • 選擇 VPC(自動建立的即可)
  • Subnet:選 public 子網路
  • Security group:允許 TCP port 3000
    5️⃣ Load balancer:先不啟用(Day 41 再加)

建立後,ECS 會自動啟動你的容器 🚀


🧭 Step 4:檢查運行狀態

在 ECS 介面中,點進 todo-cluster → Services → Tasks
應該會看到:

Last status: RUNNING
Desired status: RUNNING

點進去看「Public IP」,
這就是你 API 的外部連線位址。


🌍 Step 5:測試雲端 API

複製 Public IP,測試:

curl http://<Public-IP>:3000/health

應該會看到:

{ "status": "ok" }

或者在瀏覽器輸入:

http://<Public-IP>:3000/todos

(如果你本地有連線資料庫並打包進 Docker,這邊也能查到資料)

🎉 你的 Todo API 現在正式「跑在雲端」了!


🧰 Step 6:CloudWatch Logs 檢查日誌

進入 AWS Console → CloudWatch → Logs → Log groups
找到名稱類似:

/ecs/todo-api-task

點進去可以看到容器輸出的 Log:

🚀 Todo API running on port 3000
Database connected successfully

如果看到這兩行,代表 ECS + Prisma 都運作正常 💪


⚠️ Step 7:常見錯誤排查

問題 原因 解法
無法連線到 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

🧩 Step 8:ECS 的運行架構總覽

部署完成後,現在你的架構長這樣👇

[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 → 成功上線 🎉

我學到三件事:

  1. Fargate 幫我完全免去了「主機管理」的麻煩。
  2. CloudWatch Logs 是排錯神器,任何錯誤都能直接追到。
  3. IAM 權限與 Security Group 是關鍵,不懂這兩個幾乎什麼都連不到。

上一篇
Day38 - 持續成長學習藍圖 - AWS 與 ECS(建立第一個 ECS Cluster_手動部署容器)
系列文
《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》39
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言