什麼是 AWS ECS?
Amazon Elastic Container Service(ECS)是 AWS 提供的全受管容器編排服務,讓您能夠輕鬆部署、管理和擴展容器化應用程式。ECS 與 AWS 生態系統深度整合,包括 IAM、CloudWatch、ALB/NLB 等服務,提供安全且高可用性的容器運行環境。
ECS 的主要優勢
- 全受管服務:無需自行管理容器編排基礎設施
- 與 AWS 服務深度整合:原生支援 IAM、VPC、CloudWatch 等
- 彈性擴展:支援自動擴展,根據需求調整容器數量
- 成本效益:僅需為實際使用的運算資源付費
ECS 核心概念
Cluster(叢集)
Cluster 是 ECS 的邏輯分組單位,用於管理和組織容器資源。一個 Cluster 可以包含多個服務和任務,並且可以跨越多個可用區域以提高可用性。
1
2
| # 使用 AWS CLI 建立 ECS Cluster
aws ecs create-cluster --cluster-name my-ecs-cluster
|
Task Definition(任務定義)
Task Definition 是一個藍圖,定義了容器的運行方式,包括:
- 使用的 Docker 映像檔
- CPU 和記憶體需求
- 環境變數
- 網路模式
- 儲存掛載
- 日誌配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| {
"family": "my-web-app",
"containerDefinitions": [
{
"name": "web",
"image": "nginx:latest",
"cpu": 256,
"memory": 512,
"essential": true,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
]
}
]
}
|
Task(任務)
Task 是 Task Definition 的實例化,代表一個或多個正在運行的容器。Task 可以是:
- 獨立任務:一次性執行的任務,完成後自動終止
- 服務任務:由 Service 管理的長期運行任務
Service(服務)
Service 負責維護指定數量的 Task 持續運行。當 Task 失敗或終止時,Service 會自動啟動新的 Task 來維持期望的運行數量。
Service 的主要功能:
- 維持期望的任務數量
- 整合負載平衡器
- 支援滾動更新和藍綠部署
- 自動服務發現
啟動類型比較:EC2 vs Fargate
EC2 啟動類型
使用 EC2 啟動類型時,您需要管理運行容器的 EC2 實例。
優點:
- 完全控制底層基礎設施
- 可使用 Spot 實例降低成本
- 適合需要特定實例類型或 GPU 的工作負載
缺點:
- 需要管理和維護 EC2 實例
- 需要規劃容量和擴展策略
Fargate 啟動類型
Fargate 是無伺服器運算引擎,您無需管理底層基礎設施。
優點:
- 無需管理伺服器
- 按任務付費,更精確的成本控制
- 快速啟動,無需等待 EC2 預熱
缺點:
| 特性 | EC2 | Fargate |
|---|
| 基礎設施管理 | 使用者管理 | AWS 管理 |
| 定價模式 | EC2 實例定價 | 按 vCPU 和記憶體計費 |
| 擴展方式 | 需管理 Auto Scaling | 自動擴展 |
| 適用場景 | 大規模、成本敏感 | 快速部署、無伺服器 |
建立 ECS 服務步驟
步驟一:建立 ECS Cluster
透過 AWS Console 或 CLI 建立 Cluster:
1
2
3
4
5
6
| aws ecs create-cluster \
--cluster-name production-cluster \
--capacity-providers FARGATE FARGATE_SPOT \
--default-capacity-provider-strategy \
capacityProvider=FARGATE,weight=1 \
capacityProvider=FARGATE_SPOT,weight=1
|
步驟二:建立 Task Definition
定義您的容器規格:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| aws ecs register-task-definition \
--family my-web-app \
--network-mode awsvpc \
--requires-compatibilities FARGATE \
--cpu 256 \
--memory 512 \
--container-definitions '[
{
"name": "web",
"image": "nginx:latest",
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/my-web-app",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
}
}
]'
|
步驟三:建立 Service
建立 Service 來管理和維護 Task:
1
2
3
4
5
6
7
8
9
10
11
| aws ecs create-service \
--cluster production-cluster \
--service-name my-web-service \
--task-definition my-web-app:1 \
--desired-count 2 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={
subnets=[subnet-xxxxx,subnet-yyyyy],
securityGroups=[sg-xxxxx],
assignPublicIp=ENABLED
}"
|
步驟四:配置負載平衡器(選用)
將 Application Load Balancer 與 ECS Service 整合:
1
2
3
4
5
6
7
8
9
10
11
12
| aws ecs create-service \
--cluster production-cluster \
--service-name my-web-service \
--task-definition my-web-app:1 \
--desired-count 2 \
--launch-type FARGATE \
--load-balancers targetGroupArn=arn:aws:elasticloadbalancing:...,containerName=web,containerPort=80 \
--network-configuration "awsvpcConfiguration={
subnets=[subnet-xxxxx,subnet-yyyyy],
securityGroups=[sg-xxxxx],
assignPublicIp=DISABLED
}"
|
總結
AWS ECS 提供了一個強大且靈活的容器編排平台。透過理解 Cluster、Task Definition、Task 和 Service 這些核心概念,您可以有效地部署和管理容器化應用程式。選擇 EC2 或 Fargate 啟動類型時,需根據您的工作負載特性、成本考量和維運能力來決定。
對於剛開始使用容器服務的團隊,建議從 Fargate 開始,享受無伺服器的便利性;當對 ECS 更加熟悉且有更高的成本優化需求時,可以考慮使用 EC2 啟動類型或混合使用兩種類型。