AWS ECS + Fargate Spot:打造經濟實惠的定期任務執行方案

今天要跟各位分享一個超實用的 AWS 服務組合:ECS (Elastic Container Service) + Fargate Spot。這個組合特別適合執行定期任務,而且還能大幅降低成本。不論是數據處理、系統備份,還是定期報表生成,都非常適合!

為什麼選擇這個方案?

想像一下,如果你需要一個程式每三小時執行一次,每次只需要 2 分鐘,你會怎麼做?傳統做法可能是開一台 24 小時運作的伺服器,但這樣其實浪費了大量資源。而 ECS + Fargate Spot 方案的優勢在於:

  • 按需使用:只在需要時才啟動容器
  • 成本優勢:使用 Spot 機制可節省高達 70% 的費用
  • 全託管:完全無需管理伺服器

完整建置步驟

步驟一:準備 Docker 映像

首先,我們需要把應用程式打包成 Docker 映像並上傳到 ECR:

# 建立 ECR 倉庫 aws ecr create-repository --repository-name my-periodic-task # 登入 ECR aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com # 建立並推送映像 docker build -t my-periodic-task . docker tag my-periodic-task:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-periodic-task:latest docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-periodic-task:latest

步驟二:建立 ECS 集群

接下來,建立一個使用 Fargate Spot 的 ECS 集群:

aws ecs create-cluster \ --cluster-name my-periodic-cluster \ --capacity-providers FARGATE_SPOT \ --default-capacity-provider-strategy capacityProvider=FARGATE_SPOT,weight=1

步驟三:設置網路環境

ECS 任務需要在 VPC 中運行,設置必要的網路配置:

# 建立 VPC(如果需要) aws ec2 create-vpc --cidr-block 10.0.0.0/16 # 建立子網 aws ec2 create-subnet \ --vpc-id vpc-xxxxx \ --cidr-block 10.0.1.0/24 # 建立安全組 aws ec2 create-security-group \ --group-name ecs-tasks \ --description "Security group for ECS tasks" \ --vpc-id vpc-xxxxx

步驟四:配置 IAM 角色

建立必要的 IAM 角色和權限:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] }

步驟五:建立任務定義

創建一個詳細的任務定義:

{ "family": "my-periodic-task", "networkMode": "awsvpc", "requiresCompatibilities": ["FARGATE"], "cpu": "256", "memory": "512", "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole", "containerDefinitions": [ { "name": "task-container", "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-periodic-task:latest", "essential": true, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/my-periodic-task", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "ecs" } } } ] }

步驟六:設置定時觸發

使用 EventBridge 設置定時觸發規則:

# 建立規則(每三小時執行一次) aws events put-rule \ --name every-three-hours \ --schedule-expression "cron(0 */3 * * ? *)" \ --state ENABLED

步驟七:監控與驗證

確認任務是否正常執行:

# 檢查任務狀態 aws ecs list-tasks --cluster my-periodic-cluster # 查看日誌 aws logs get-log-events \ --log-group-name /ecs/my-periodic-task \ --log-stream-name task-container/latest

成本分析

讓我們看一個實際例子:

  • 配置:0.5 vCPU + 1GB 記憶體
  • 執行時間:每次 2 分鐘
  • 頻率:每天 8 次(每三小時一次)

傳統 Fargate 費用:

  • CPU:0.5 × $0.04050 × (2/60) × 8 = $0.0054/天
  • 記憶體:1 × $0.004445 × (2/60) × 8 = $0.0006/天

使用 Fargate Spot(節省 70%):

  • 每天總費用約 $0.0018
  • 每月費用不到 $0.06

常見問題排解

  1. 任務無法啟動?
    • 檢查 IAM 角色權限是否正確
    • 確認網路配置是否正確
    • 查看 CloudWatch Logs 錯誤信息
  2. 容器無法拉取?
    • 確認 ECR 權限設置
    • 檢查映像標籤是否正確
    • 驗證網路連接狀況
  3. 任務啟動後立即停止?
    • 檢查容器的健康檢查設置
    • 確認記憶體/CPU 配置是否足夠
    • 檢視應用程式日誌

最佳實踐建議

  1. 資源配置:
    • 根據實際需求設置 CPU 和記憶體
    • 避免資源過度配置
    • 定期檢查資源使用情況
  2. 監控設置:
    • 設置適當的日誌保留期限
    • 配置關鍵指標告警
    • 定期檢查執行狀況
  3. 錯誤處理:
    • 實作任務重試機制
    • 設置失敗通知
    • 保存詳細的錯誤日誌

結語

使用 AWS ECS + Fargate Spot 來執行定期任務,不僅可以大幅降低成本,還能簡化維護工作。這個方案特別適合那些需要定期執行、執行時間較短的任務。通過本文的步驟,相信大家都能順利建置出一個經濟實惠、穩定可靠的定期任務執行環境。

留言

此網誌的熱門文章

怎麼讓 VS Code 自動排版變漂亮? Prettier ESLint

Flutter 錄音應用中的權限請求問題