AWS ECS Service:讓你的容器穩定持續運行的關鍵機制

Published June 16, 2025 by 徐培鈞
架構

當你使用 AWS ECS(Elastic Container Service)成功啟動一個 Task,看見容器開始執行時,也許會有一種「大功告成」的錯覺。

但你會發現:

  • Task 執行完就會結束(像定時任務、資料處理等)。
  • 如果容器異常退出,不會自動重啟
  • 想要一直維持某個服務(像 API 或前端伺服器)在線上?那就得手動重新啟動 Task……

這時候,就需要一個「指揮家」來幫你穩定安排 Task 的運行狀態。

這個角色就是 ECS Service

什麼是 ECS Service?—容器世界中的「導演」

在 AWS ECS 的架構中,Task 是一個實際執行容器的單位。

你可以把 Task 想成是一場演出中的「演員」,它穿著容器這套戲服,在舞台上演出某個角色,例如提供一個 API、處理使用者上傳的圖片、或是處理排程任務。

但如果你只是手動啟動一個 Task,這個 Task 就像一位演員自己登台,演完就下台。

若這位演員突然病倒(容器崩潰),整場戲就沒人演了。

這樣的運作方式無法保證應用程式穩定且持續提供服務

這時候就需要「導演」來掌控全場,確保每個演員(Task)都就位、有人生病馬上補位、場上始終維持演出水準。這個導演就是——ECS Service

ECS Service 的核心目的

ECS Service 是一種持續監控與管理 Task 的控制器,能自動確保你的容器服務「一直有在執行,而且數量正確」。

它不只是一次性地「啟動一個 Task」,而是:

  1. 維持固定數量的 Task 運行中(例如你設定要 3 個副本,就會永遠維持 3 個)
  2. 當 Task 當掉時,會自動重啟一個新的補上
  3. 可以設定 Auto Scaling,根據負載自動增加或減少 Task 數量
  4. 可以結合 Application Load Balancer,將使用者請求平均分派給這些 Task

這讓你的應用服務可以像雲一樣彈性伸縮,不會因為容器當掉或訪問量暴增而中斷。

生活化類比:戲劇演出 vs 容器服務

ECS 對應概念Task
說明每個 Task 就是一個容器任務,執行應用邏輯
ECS 對應概念Container
說明Task 內部穿的就是容器 Image,決定它演什麼戲
ECS 對應概念ECS Service
說明決定什麼時候該派人上場、場上維持幾個演員、是否需要替補或增援
ECS 對應概念ECS Cluster
說明容器任務實際執行的地方,可以是 EC2 或 Fargate
ECS 對應概念使用者請求
說明使用者透過 Load Balancer 對外連線,觀賞這場服務演出

這個類比幫助你理解:ECS Service 負責的是持續性、穩定性與擴展性,而不是單純一次性的啟動行為。

為什麼需要 ECS Service?

沒有 ECS Service 的結果手動重新啟動,非常麻煩
使用 ECS Service 的好處自動重新啟動容器
沒有 ECS Service 的結果手動部署、難以同步
使用 ECS Service 的好處自動啟動多個 Task,整合 ALB
沒有 ECS Service 的結果容器無法負荷請求
使用 ECS Service 的好處可搭配 Auto Scaling,自動增加 Task
沒有 ECS Service 的結果無法保證穩定
使用 ECS Service 的好處持續監控、補足 Task 數量

🧠 一句話總結:

ECS Task 負責「演戲」,ECS Service 負責「讓戲不間斷」。

若你想讓你的應用服務真正進入生產環境,具備高度可用性與穩定性,ECS Service 是必備的角色。

ECS Service 的三大核心功能:讓你的服務 24 小時不間斷

ECS Service 的價值在於持續穩定地運行容器應用程式,就像一位貼心又可靠的自動化指揮官。

以下是它最重要的三個功能,也是讓你從「自己養容器」變成「讓 AWS 幫你養容器」的關鍵差異:

自動重啟 Task(Auto Recovery)— 系統故障時的自動補位機制

在沒有 Service 的情況下,如果一個 Task(容器)崩潰了,那你就只能自己手動重啟。

這在小規模測試還勉強可以接受,但在實務上是不可能容忍的風險。

有了 ECS Service,就像有一個「容器總管」時時在檢查場上有幾位演員還在線:

  • 如果其中一個 Task 掛了(容器錯誤退出、節點失聯等),Service 馬上啟動一個新的 Task 補上。
  • 這是透過「Desired Count(期望數量)」來控制的。
    你告訴 Service:「我要 3 個 Task」,它就會永遠幫你維持這個數字。

📌 這項功能特別適合用在:

  • API 伺服器
  • 即時聊天室
  • 線上服務的主程式
  • 任何不能中斷的系統服務

自動擴展與縮減(Auto Scaling)— 流量高峰的救星,離峰時的省錢法寶

當你的服務開始面對不穩定的使用流量(例如白天使用者爆增、晚上安靜如雞),你不會希望始終維持一樣的容器數量,這樣要嘛撐不住,要嘛浪費資源。

ECS Service 支援 Auto Scaling 功能,能根據你設定的條件,自動增加或減少 Task 的數量

📈 常見的自動擴縮觸發條件包括:

  • CPU 使用率大於 70% 超過 1 分鐘 ➜ 增加 Task
  • Memory 使用率小於 30% 持續 5 分鐘 ➜ 減少 Task

這些條件可以透過 CloudWatch 指標 來設定,甚至也能根據隊列長度、API 請求速率等自定義指標調整。

📌 Auto Scaling 能帶來:

  • 在高峰時自動擴容,防止服務崩潰
  • 在低谷時自動縮容,節省雲端支出
  • 彈性部署,真正落實「按需計費」的雲端精神

整合 Load Balancer(對外提供穩定服務)— 讓使用者連得上,也連得快

當你有多個 Task 時,如何讓使用者「公平地」分流到這些容器呢?

這時候就要靠 Application Load Balancer(ALB)

ECS Service 支援直接整合 ALB,達成以下效果:

  • 每個 Task 被 ALB 註冊為一個 Target(目標實例)
  • 當使用者發送請求,ALB 會根據健康狀態與流量規則,將請求分配到其中一個 Task
  • 若某個 Task 不健康(例如不回應 HTTP 健康檢查),ALB 就不會分派請求給它

💡 實際應用場景:

整合 ALB 帶來的好處用戶請求自動分流,提升回應速度
整合 ALB 帶來的好處當其中一個 Task 爆炸時,ALB 自動避開故障容器
整合 ALB 帶來的好處每個容器服務掛在不同的路由或端口,由 ALB 管控

圖解補充:ECS Service 如何串聯整個運作流程?

graph TB
    User[👤 使用者請求<br/>HTTP] --> ALB[🔄 Application Load Balancer]

    ALB --> Task1[📦 Task 1<br/>API 服務]
    ALB --> Task2[📦 Task 2<br/>API 服務]

    subgraph ECS["🎛️ ECS Service 控制"]
        Health[❤️ 健康檢查]
        Recovery[🔧 自動修復] 
        Scale[📊 Task 數量管理]
    end

    ECS -.管理.-> Task1
    ECS -.管理.-> Task2

    classDef userStyle fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
    classDef albStyle fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    classDef taskStyle fill:#e8f5e8,stroke:#388e3c,stroke-width:2px
    classDef ecsStyle fill:#fff3e0,stroke:#f57c00,stroke-width:2px

    class User userStyle
    class ALB albStyle
    class Task1,Task2 taskStyle
    class ECS ecsStyle

📍 圖解說明:

  • ALB 是統一入口點(使用者不需要知道有幾個 Task)
  • Task 是背後的實際運算單元
  • ECS Service 保證 Task 數量與健康狀態,負責調度與維護
  • 若 Task 失效,Service 重啟;若流量變動,Service 幫你擴縮容器

建立 ECS Service 的基本流程(Fargate 範例)

建立一個 ECS Service,等於是把你的應用服務「自動化長時間運行」起來,以下是使用 AWS CLI 的步驟拆解與說明:

步驟一:準備工作

在執行建立 Service 的指令之前,你需要先完成以下幾個前置條件:

建立 ECS Cluster

aws ecs create-cluster --cluster-name my-cluster

建立 Task Definition

這會定義容器該怎麼執行(使用哪個映像檔、port、記憶體、CPU…)

aws ecs register-task-definition --cli-input-json file://task-definition.json

設定 ALB 與 Target Group(若需要對外服務)

  • ALB 是負責流量分發的入口
  • Target Group 是 Task 的集合,ALB 把流量導向這裡

建立 VPC 子網路與安全群組

  • 用於讓容器在 Fargate 模式下能夠正常連網
  • 至少需要一個 Subnet 和一個 Security Group

步驟二:建立 ECS Service(CLI 語法說明)

aws ecs create-service \
  --cluster my-cluster \                             # 指定你的 ECS Cluster 名稱
  --service-name my-api-service \                    # 幫你的 Service 取一個名稱
  --task-definition my-task-def:1 \                  # 使用哪一個 Task Definition(含版本)
  --desired-count 2 \                                # 要維持幾個 Task 執行中
  --launch-type FARGATE \                            # 使用 Fargate 模式,不需管理 EC2
  --network-configuration "awsvpcConfiguration={     # VPC 設定
      subnets=[subnet-abc123],                       # 指定子網路 ID
      securityGroups=[sg-abc123],                    # 指定安全群組 ID
      assignPublicIp=ENABLED                         # 是否分配公開 IP(若要對外開放)
  }" \
  --load-balancers "targetGroupArn=arn:aws:...,      # ALB 的 Target Group ARN
      containerName=my-container,                    # 要連接的容器名稱(與 Task Definition 一致)
      containerPort=80"                              # 要導流的容器內部 port

📌 指令結果:這個 Service 建立好後,會在你指定的 Cluster 上,啟動 2 個 Task,並透過 ALB 對外提供服務。
若其中一個 Task 當掉,ECS 會自動補上。若使用者連進來,請求會透過 ALB 分發到健康的 Task。

🧠 小技巧:也可以用 capacity-provider-strategy 來指定混合使用 EC2 / Fargate

--capacity-provider-strategy capacityProvider=FARGATE,weight=1

適合進階應用,例如你希望部分 Task 用 Fargate,部分跑在自管的 EC2 上。

小提醒:什麼時候該使用 ECS Service?

你不需要為所有的容器任務都建立 Service。以下是實務上常見場景判斷:

建議❌ 不需要 ECS Service,只需要執行一次性的 Task 即可(如 run-task)
建議❌ 不需要 ECS Service,建議使用 Scheduled Task(透過 CloudWatch Events / EventBridge)
建議✅ 非常適合 ECS Service,可持續監控與自動重啟
建議✅ 適合使用 ECS Service 確保不中斷
建議✅ 建議使用 Service + Load Balancer 架構

結語:Service 是 ECS 長期運營的基礎

如果說 Task 是短跑選手,Service 就是馬拉松選手的教練——負責監控狀況、調整策略、確保不中斷地跑下去。

對於需要穩定、可用性高、可自動擴縮的服務型應用,ECS Service 是你不可或缺的武器。