iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0

小明的容器農場計畫

今天我們要來學習 ECS Task Definition,這就像是為我們的交易程式寫一份詳細的「工作說明書」。還記得小時候幫爸爸種菜時,他總是會仔細告訴我每種作物需要多少水、多少肥料、種在哪裡?Task Definition 就是這樣的概念!

什麼是 Task Definition?

Task Definition 是 ECS 中的核心概念,它定義了:

  • 容器要如何運行(就像告訴工人要做什麼)
  • 需要多少資源(就像告訴工人需要多少工具)
  • 環境設定(就像告訴工人工作環境的條件)
  • 網路配置(就像告訴工人要在哪個工作區域)

Task Definition 的組成要素

graph TD
    A[Task Definition<br/>工作說明書] --> B[Container Definitions<br/>容器定義]
    A --> C[Task Role<br/>執行角色]
    A --> D[Network Mode<br/>網路模式]
    A --> E[CPU & Memory<br/>資源配置]
    A --> F[Volumes<br/>儲存卷]
    
    B --> G[Image URI<br/>容器映像]
    B --> H[Port Mappings<br/>埠號對應]
    B --> I[Environment Variables<br/>環境變數]
    B --> J[Logging<br/>日誌設定]
    
    style A fill:#e3f2fd
    style B fill:#f3e5f5
    style C fill:#fff3e0
    style D fill:#e8f5e8

我們的交易系統 Task Definition

基本架構設計

我們的量化交易系統將包含以下容器:

  1. 主交易程式容器:執行交易邏輯
  2. 監控代理容器:收集系統指標
  3. 日誌收集容器:統一管理日誌

Task Definition JSON 範例

{
    "family": "trading-bot-task",
    "taskRoleArn": "arn:aws:iam::123456789012:role/ECSTaskRole",
    "executionRoleArn": "arn:aws:iam::123456789012:role/ECSExecutionRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": ["FARGATE"],
    "cpu": "512",
    "memory": "1024",
    "containerDefinitions": [
        {
            "name": "trading-bot",
            "image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/trading-bot:latest",
            "portMappings": [
                {
                    "containerPort": 8080,
                    "protocol": "tcp"
                }
            ],
            "environment": [
                {
                    "name": "ENVIRONMENT",
                    "value": "production"
                },
                {
                    "name": "LOG_LEVEL", 
                    "value": "INFO"
                }
            ],
            "secrets": [
                {
                    "name": "BYBIT_API_KEY",
                    "valueFrom": "arn:aws:secretsmanager:us-east-1:123456789012:secret:trading-secrets:BYBIT_API_KEY"
                },
                {
                    "name": "BYBIT_SECRET_KEY",
                    "valueFrom": "arn:aws:secretsmanager:us-east-1:123456789012:secret:trading-secrets:BYBIT_SECRET_KEY"
                }
            ],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/trading-bot",
                    "awslogs-region": "us-east-1",
                    "awslogs-stream-prefix": "ecs"
                }
            },
            "healthCheck": {
                "command": [
                    "CMD-SHELL",
                    "curl -f http://localhost:8080/health || exit 1"
                ],
                "interval": 30,
                "timeout": 5,
                "retries": 3,
                "startPeriod": 60
            }
        }
    ]
}

關鍵配置詳解

1. 資源配置

{
    "cpu": "512",        // 0.5 vCPU (512 CPU units)
    "memory": "1024"     // 1 GB RAM
}

為什麼選擇這個配置?

  • 量化交易程式通常不需要太多 CPU
  • 1GB 記憶體足夠處理市場數據和策略計算
  • 可以根據實際使用情況調整

2. 網路模式

{
    "networkMode": "awsvpc"
}

awsvpc 模式的優勢:

  • 每個 Task 都有獨立的 ENI(網路介面)
  • 可以直接分配 Security Group
  • 更好的網路隔離

3. 環境變數和機密資訊

graph LR
    A[環境變數管理] --> B[一般設定<br/>Environment]
    A --> C[機密資訊<br/>Secrets]
    
    B --> D[LOG_LEVEL<br/>ENVIRONMENT<br/>TIMEZONE]
    C --> E[API_KEY<br/>SECRET_KEY<br/>DATABASE_PASSWORD]
    
    C --> F[AWS Secrets Manager<br/>安全儲存]
    
    style C fill:#ffcccc
    style F fill:#ccffcc

4. 健康檢查

{
    "healthCheck": {
        "command": [
            "CMD-SHELL", 
            "curl -f http://localhost:8080/health || exit 1"
        ],
        "interval": 30,      // 每 30 秒檢查一次
        "timeout": 5,        // 5 秒超時
        "retries": 3,        // 失敗 3 次才判定不健康
        "startPeriod": 60    // 啟動後 60 秒才開始檢查
    }
}

不同環境的 Task Definition

開發環境

{
    "family": "trading-bot-dev",
    "cpu": "256",
    "memory": "512",
    "containerDefinitions": [
        {
            "name": "trading-bot-dev",
            "image": "trading-bot:dev",
            "environment": [
                {
                    "name": "ENVIRONMENT",
                    "value": "development"
                },
                {
                    "name": "LOG_LEVEL",
                    "value": "DEBUG"
                }
            ]
        }
    ]
}

生產環境

{
    "family": "trading-bot-prod",
    "cpu": "1024", 
    "memory": "2048",
    "containerDefinitions": [
        {
            "name": "trading-bot-prod",
            "image": "trading-bot:latest",
            "environment": [
                {
                    "name": "ENVIRONMENT", 
                    "value": "production"
                },
                {
                    "name": "LOG_LEVEL",
                    "value": "INFO"
                }
            ]
        }
    ]
}

建立和管理 Task Definition

使用 AWS CLI 建立

# 註冊 Task Definition
aws ecs register-task-definition \
    --cli-input-json file://task-definition.json

# 查看 Task Definition
aws ecs describe-task-definition \
    --task-definition trading-bot-task

# 列出所有版本
aws ecs list-task-definitions \
    --family-prefix trading-bot-task

更新 Task Definition

# 更新時會建立新版本
aws ecs register-task-definition \
    --cli-input-json file://task-definition-v2.json

# 查看特定版本
aws ecs describe-task-definition \
    --task-definition trading-bot-task:2

最佳實踐

1. 版本管理策略

graph LR
    A[Git Tag] --> B[Docker Image Tag]
    B --> C[Task Definition Revision]
    C --> D[ECS Service Update]
    
    A --> E[v1.0.0]
    E --> F[trading-bot:v1.0.0]
    F --> G[trading-bot-task:1]
    
    style A fill:#e3f2fd
    style D fill:#e8f5e8

2. 資源優化

CPU 和記憶體配置建議:

環境 CPU Memory 適用場景
開發 256 512MB 基本測試
測試 512 1GB 功能驗證
生產 1024 2GB 正式交易

3. 安全配置

{
    "secrets": [
        {
            "name": "DATABASE_PASSWORD",
            "valueFrom": "arn:aws:secretsmanager:region:account:secret:name"
        }
    ],
    "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
            "awslogs-group": "/ecs/trading-bot",
            "awslogs-region": "us-east-1"
        }
    }
}

4. 監控和日誌

{
    "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
            "awslogs-group": "/ecs/trading-bot",
            "awslogs-region": "us-east-1",
            "awslogs-stream-prefix": "ecs",
            "awslogs-datetime-format": "%Y-%m-%d %H:%M:%S"
        }
    }
}

故障排除

常見問題

  1. Task 無法啟動

    • 檢查 IAM 角色權限
    • 確認映像檔是否存在
    • 檢查網路配置
  2. 健康檢查失敗

    • 確認健康檢查端點是否正確
    • 調整超時和重試設定
    • 檢查應用程式啟動時間
  3. 記憶體不足

    • 監控實際使用量
    • 適當調整記憶體配置
    • 優化應用程式記憶體使用

除錯指令

# 查看 Task 運行狀態
aws ecs describe-tasks \
    --cluster trading-cluster \
    --tasks arn:aws:ecs:region:account:task/task-id

# 查看容器日誌
aws logs get-log-events \
    --log-group-name /ecs/trading-bot \
    --log-stream-name ecs/trading-bot/task-id

小結

今天我們學習了如何為我們的量化交易程式寫一份詳細的「工作說明書」- Task Definition。就像爸爸教我種菜時會仔細說明每個步驟一樣,正確的 Task Definition 確保我們的容器能夠按照預期運行。

關鍵要記住的是:

  1. 資源配置要合理:不要浪費,也不要不夠用
  2. 安全第一:機密資訊要用 Secrets Manager
  3. 監控很重要:設定好健康檢查和日誌
  4. 版本管理:每次更新都要有清楚的版本號

明天我們將學習 ECS Service,了解如何讓我們的 Task Definition 實際運行起來!


下一篇:Day 7 - AWS ECS Service


上一篇
Day 5: VPC & Security Group - 蓋起我們的第一道城牆
下一篇
Day 7: AWS ECS Service
系列文
小資族的量化交易 10111
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言