AWS ECS 容器服務基礎架構

Introduction to AWS ECS container service architecture and core concepts

什麼是 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 預熱

缺點:

  • 相對較高的單位成本
  • 對底層基礎設施的控制較少
特性EC2Fargate
基礎設施管理使用者管理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 啟動類型或混合使用兩種類型。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy