iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0

小明的標準化農具準備

今天我們要學習 AWS Launch Template,這就像是為農場工人準備標準化的工具包。還記得爸爸總是為每個季節準備相同規格的農具嗎?這樣不管來了多少工人,都能立刻開始工作。Launch Template 就是這個概念!

什麼是 Launch Template?

Launch Template 是一個範本,定義了 EC2 執行個體應該如何啟動:

  • AMI (Amazon Machine Image):就像工人的基本技能包
  • 執行個體類型:就像工人的體力等級
  • 安全群組:就像工人的工作權限
  • 使用者資料:就像工人報到時的指導手冊

為什麼需要 Launch Template?

傳統方式的問題

graph TD
    A[需要新的 EC2] --> B[手動選擇 AMI]
    B --> C[手動選擇執行個體類型]
    C --> D[手動設定安全群組]
    D --> E[手動寫入使用者資料]
    E --> F[啟動執行個體]
    
    G[又需要新的 EC2] --> B
    
    style A fill:#ffcccc
    style G fill:#ffcccc

使用 Launch Template 的優勢

graph TD
    A[需要新的 EC2] --> B[使用 Launch Template]
    B --> C[自動套用所有設定]
    C --> D[啟動執行個體]
    
    E[又需要新的 EC2] --> B
    F[大量 EC2 需求] --> B
    
    style B fill:#ccffcc
    style C fill:#ccffcc
    style D fill:#ccffcc

我們的交易系統 Launch Template

基本需求分析

我們的 ECS 執行個體需要:

  1. ECS 優化的 AMI:預裝 Docker 和 ECS Agent
  2. 適當的執行個體類型:平衡成本和效能
  3. IAM 角色:讓 EC2 可以註冊到 ECS Cluster
  4. 使用者資料:自動設定和註冊到 ECS

Launch Template JSON 範例

{
    "LaunchTemplateName": "trading-ecs-template",
    "LaunchTemplateData": {
        "ImageId": "ami-0c02fb55956c7d316",
        "InstanceType": "t3.medium",
        "KeyName": "trading-keypair",
        "SecurityGroupIds": [
            "sg-ecs-instances"
        ],
        "IamInstanceProfile": {
            "Name": "ecsInstanceProfile"
        },
        "UserData": "IyEvYmluL2Jhc2gKZWNobyBFQ1NfQ0xVU1RFUj10cmFkaW5nLWNsdXN0ZXIgPj4gL2V0Yy9lY3MvZWNzLmNvbmYK",
        "BlockDeviceMappings": [
            {
                "DeviceName": "/dev/xvda",
                "Ebs": {
                    "VolumeSize": 30,
                    "VolumeType": "gp3",
                    "DeleteOnTermination": true,
                    "Encrypted": true
                }
            }
        ],
        "Monitoring": {
            "Enabled": true
        },
        "TagSpecifications": [
            {
                "ResourceType": "instance",
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": "trading-ecs-instance"
                    },
                    {
                        "Key": "Environment",
                        "Value": "production"
                    },
                    {
                        "Key": "Project",
                        "Value": "quantitative-trading"
                    }
                ]
            }
        ]
    }
}

User Data 腳本詳解

User Data 是 EC2 啟動時自動執行的腳本:

#!/bin/bash

# 設定 ECS Cluster 名稱
echo ECS_CLUSTER=trading-cluster >> /etc/ecs/ecs.conf

# 安裝 CloudWatch Agent
yum install -y amazon-cloudwatch-agent

# 設定 CloudWatch Agent
cat > /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json << 'EOF'
{
    "metrics": {
        "namespace": "TradingSystem/EC2",
        "metrics_collected": {
            "cpu": {
                "measurement": ["cpu_usage_idle", "cpu_usage_iowait"],
                "metrics_collection_interval": 60
            },
            "disk": {
                "measurement": ["used_percent"],
                "metrics_collection_interval": 60,
                "resources": ["*"]
            },
            "mem": {
                "measurement": ["mem_used_percent"],
                "metrics_collection_interval": 60
            }
            }
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/ecs/ecs-agent.log",
                        "log_group_name": "/aws/ecs/containerinsights/trading-cluster/ecs-agent",
                        "log_stream_name": "{instance_id}"
                    }
                ]
            }
        }
    }
}
EOF

# 啟動 CloudWatch Agent
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
    -a fetch-config \
    -m ec2 \
    -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \
    -s

# 安裝額外的監控工具
yum install -y htop iotop

# 設定自動更新安全補丁
yum update -y --security

# 重新啟動 ECS Agent 確保設定生效
restart ecs

User Data Base64 編碼:

# 將腳本編碼為 Base64
cat user-data.sh | base64 -w 0

不同環境的 Launch Template

開發環境範本

{
    "LaunchTemplateName": "trading-ecs-dev-template",
    "LaunchTemplateData": {
        "ImageId": "ami-0c02fb55956c7d316",
        "InstanceType": "t3.micro",
        "KeyName": "trading-dev-keypair",
        "SecurityGroupIds": ["sg-ecs-dev"],
        "UserData": "IyEvYmluL2Jhc2gKZWNobyBFQ1NfQ0xVU1RFUj10cmFkaW5nLWRldi1jbHVzdGVyID4+IC9ldGMvZWNzL2Vjcy5jb25mCg==",
        "BlockDeviceMappings": [
            {
                "DeviceName": "/dev/xvda",
                "Ebs": {
                    "VolumeSize": 20,
                    "VolumeType": "gp3"
                }
            }
        ]
    }
}

生產環境範本

{
    "LaunchTemplateName": "trading-ecs-prod-template", 
    "LaunchTemplateData": {
        "ImageId": "ami-0c02fb55956c7d316",
        "InstanceType": "c5.large",
        "KeyName": "trading-prod-keypair",
        "SecurityGroupIds": ["sg-ecs-prod"],
        "UserData": "IyEvYmluL2Jhc2gKZWNobyBFQ1NfQ0xVU1RFUj10cmFkaW5nLXByb2QtY2x1c3RlciA+PiAvZXRjL2Vjcy9lY3MuY29uZgo=",
        "BlockDeviceMappings": [
            {
                "DeviceName": "/dev/xvda",
                "Ebs": {
                    "VolumeSize": 50,
                    "VolumeType": "gp3",
                    "Iops": 3000,
                    "Encrypted": true
                }
            }
        ],
        "Monitoring": {
            "Enabled": true
        }
    }
}

建立和管理 Launch Template

使用 AWS CLI 建立

# 建立 Launch Template
aws ec2 create-launch-template \
    --cli-input-json file://launch-template.json

# 查看 Launch Template
aws ec2 describe-launch-templates \
    --launch-template-names trading-ecs-template

# 查看特定版本
aws ec2 describe-launch-template-versions \
    --launch-template-name trading-ecs-template \
    --versions 1

更新 Launch Template

# 建立新版本
aws ec2 create-launch-template-version \
    --launch-template-name trading-ecs-template \
    --launch-template-data file://launch-template-v2.json \
    --source-version 1

# 設定預設版本
aws ec2 modify-launch-template \
    --launch-template-name trading-ecs-template \
    --default-version 2

版本管理策略

graph LR
    A[Launch Template] --> B[Version 1<br/>初始版本]
    A --> C[Version 2<br/>安全更新]
    A --> D[Version 3<br/>效能優化]
    A --> E[Version $Latest<br/>最新版本]
    A --> F[Version $Default<br/>預設版本]
    
    G[Auto Scaling Group] --> F
    H[手動啟動] --> E
    
    style F fill:#ccffcc
    style E fill:#ffffcc

最佳實踐

1. AMI 選擇策略

graph TD
    A[AMI 選擇] --> B[ECS 優化 AMI<br/>建議使用]
    A --> C[Amazon Linux 2<br/>需要手動設定]
    A --> D[自訂 AMI<br/>進階使用]
    
    B --> E[✅ 預裝 ECS Agent<br/>✅ 預裝 Docker<br/>✅ 定期更新]
    C --> F[⚠️ 需要安裝 ECS Agent<br/>⚠️ 需要設定 Docker]
    D --> G[✅ 完全客製化<br/>⚠️ 需要維護]
    
    style B fill:#ccffcc
    style C fill:#ffffcc
    style D fill:#ffcccc

2. 執行個體類型選擇

類型 vCPU Memory 網路效能 適用場景
t3.micro 2 1 GB 低-中等 開發/測試
t3.medium 2 4 GB 低-中等 小型生產
c5.large 2 4 GB CPU 密集
m5.large 2 8 GB 平衡型

3. 儲存配置

{
    "BlockDeviceMappings": [
        {
            "DeviceName": "/dev/xvda",
            "Ebs": {
                "VolumeSize": 30,          // 系統碟大小
                "VolumeType": "gp3",       // 最新的 GP3 類型
                "Iops": 3000,             // 自訂 IOPS
                "Throughput": 125,        // 自訂輸送量
                "DeleteOnTermination": true,
                "Encrypted": true          // 加密儲存
            }
        }
    ]
}

4. 安全設定

{
    "SecurityGroupIds": [
        "sg-ecs-instances"              // ECS 執行個體安全群組
    ],
    "KeyName": "trading-keypair",       // SSH 金鑰對
    "IamInstanceProfile": {
        "Name": "ecsInstanceProfile"    // IAM 角色
    },
    "MetadataOptions": {
        "HttpEndpoint": "enabled",
        "HttpTokens": "required",       // 強制使用 IMDSv2
        "HttpPutResponseHopLimit": 1
    }
}

故障排除

常見問題

  1. EC2 無法註冊到 ECS Cluster

    # 檢查 ECS Agent 狀態
    sudo docker ps | grep ecs-agent
    
    # 檢查 ECS 設定
    cat /etc/ecs/ecs.conf
    
    # 檢查 ECS Agent 日誌
    sudo docker logs ecs-agent
    
  2. User Data 腳本失敗

    # 檢查 cloud-init 日誌
    sudo cat /var/log/cloud-init-output.log
    
    # 檢查系統日誌
    sudo journalctl -u cloud-final
    
  3. IAM 權限問題

    # 檢查執行個體角色
    curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
    
    # 測試 ECS 權限
    aws ecs list-clusters --region us-east-1
    

除錯工具

# 檢查執行個體狀態
aws ec2 describe-instances \
    --instance-ids i-1234567890abcdef0

# 檢查 Launch Template 使用情況
aws ec2 describe-launch-template-versions \
    --launch-template-name trading-ecs-template

# 測試 Launch Template
aws ec2 run-instances \
    --launch-template LaunchTemplateName=trading-ecs-template,Version=1 \
    --min-count 1 \
    --max-count 1

小結

今天我們學習了 Launch Template,這個標準化的工具讓我們可以快速且一致地啟動 EC2 執行個體。就像爸爸為每個季節準備標準化農具包一樣,Launch Template 確保每個新的執行個體都有相同的配置。

重要概念回顧:

  1. 標準化:統一的執行個體配置
  2. 版本控制:可以管理不同版本的範本
  3. 自動化:透過 User Data 自動設定
  4. 安全性:加密儲存和適當的 IAM 角色
  5. 監控:內建 CloudWatch 監控

明天我們將學習 Auto Scaling Group,了解如何讓我們的執行個體數量根據需求自動調整!


下一篇:Day 9 - AWS Auto Scaling Group


上一篇
Day 7: AWS ECS Service
下一篇
Day 9: AWS Auto Scaling Group
系列文
小資族的量化交易 10111
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言