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
常見問題排解
- 任務無法啟動?
- 檢查 IAM 角色權限是否正確
- 確認網路配置是否正確
- 查看 CloudWatch Logs 錯誤信息
- 容器無法拉取?
- 確認 ECR 權限設置
- 檢查映像標籤是否正確
- 驗證網路連接狀況
- 任務啟動後立即停止?
- 檢查容器的健康檢查設置
- 確認記憶體/CPU 配置是否足夠
- 檢視應用程式日誌
最佳實踐建議
- 資源配置:
- 根據實際需求設置 CPU 和記憶體
- 避免資源過度配置
- 定期檢查資源使用情況
- 監控設置:
- 設置適當的日誌保留期限
- 配置關鍵指標告警
- 定期檢查執行狀況
- 錯誤處理:
- 實作任務重試機制
- 設置失敗通知
- 保存詳細的錯誤日誌
結語
使用 AWS ECS + Fargate Spot 來執行定期任務,不僅可以大幅降低成本,還能簡化維護工作。這個方案特別適合那些需要定期執行、執行時間較短的任務。通過本文的步驟,相信大家都能順利建置出一個經濟實惠、穩定可靠的定期任務執行環境。
留言
發佈留言