今天我們要學習 AWS Launch Template,這就像是為農場工人準備標準化的工具包。還記得爸爸總是為每個季節準備相同規格的農具嗎?這樣不管來了多少工人,都能立刻開始工作。Launch Template 就是這個概念!
Launch Template 是一個範本,定義了 EC2 執行個體應該如何啟動:
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
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
我們的 ECS 執行個體需要:
{
"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 是 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
{
"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 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
# 建立新版本
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
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
類型 | vCPU | Memory | 網路效能 | 適用場景 |
---|---|---|---|---|
t3.micro | 2 | 1 GB | 低-中等 | 開發/測試 |
t3.medium | 2 | 4 GB | 低-中等 | 小型生產 |
c5.large | 2 | 4 GB | 高 | CPU 密集 |
m5.large | 2 | 8 GB | 高 | 平衡型 |
{
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"VolumeSize": 30, // 系統碟大小
"VolumeType": "gp3", // 最新的 GP3 類型
"Iops": 3000, // 自訂 IOPS
"Throughput": 125, // 自訂輸送量
"DeleteOnTermination": true,
"Encrypted": true // 加密儲存
}
}
]
}
{
"SecurityGroupIds": [
"sg-ecs-instances" // ECS 執行個體安全群組
],
"KeyName": "trading-keypair", // SSH 金鑰對
"IamInstanceProfile": {
"Name": "ecsInstanceProfile" // IAM 角色
},
"MetadataOptions": {
"HttpEndpoint": "enabled",
"HttpTokens": "required", // 強制使用 IMDSv2
"HttpPutResponseHopLimit": 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
User Data 腳本失敗
# 檢查 cloud-init 日誌
sudo cat /var/log/cloud-init-output.log
# 檢查系統日誌
sudo journalctl -u cloud-final
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 確保每個新的執行個體都有相同的配置。
重要概念回顧:
明天我們將學習 Auto Scaling Group,了解如何讓我們的執行個體數量根據需求自動調整!
下一篇:Day 9 - AWS Auto Scaling Group