Auto Scaling 概述與使用情境
AWS EC2 Auto Scaling 是一項強大的服務,可根據應用程式需求自動調整 EC2 執行個體數量。透過 Auto Scaling,您可以確保應用程式在需求高峰時擁有足夠的運算資源,並在需求降低時自動縮減資源以節省成本。
常見使用情境
- 流量波動的網站應用程式:電商網站在促銷期間流量激增
- 批次處理工作負載:根據佇列深度自動擴展處理能力
- 開發與測試環境:在非工作時間自動縮減資源
- 高可用性架構:確保最低執行個體數量以維持服務可用性
Auto Scaling 元件
Auto Scaling 由三個主要元件組成:
1. 啟動範本 (Launch Template)
啟動範本定義了 EC2 執行個體的配置,包括 AMI、執行個體類型、安全群組、金鑰對等設定。
2. Auto Scaling 群組 (Auto Scaling Group)
Auto Scaling 群組管理一組 EC2 執行個體,定義最小、最大和期望的執行個體數量。
3. 擴展政策 (Scaling Policy)
擴展政策決定何時以及如何調整執行個體數量。
建立啟動範本 (Launch Template)
首先,我們需要建立一個啟動範本來定義執行個體配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 建立啟動範本
aws ec2 create-launch-template \
--launch-template-name my-web-app-template \
--version-description "Web application server v1" \
--launch-template-data '{
"ImageId": "ami-0abcdef1234567890",
"InstanceType": "t3.medium",
"KeyName": "my-key-pair",
"SecurityGroupIds": ["sg-0123456789abcdef0"],
"UserData": "IyEvYmluL2Jhc2gKeXVtIHVwZGF0ZSAteQp5dW0gaW5zdGFsbCAteSBodHRwZApzeXN0ZW1jdGwgc3RhcnQgaHR0cGQKc3lzdGVtY3RsIGVuYWJsZSBodHRwZA==",
"TagSpecifications": [{
"ResourceType": "instance",
"Tags": [{"Key": "Name", "Value": "WebServer"}]
}]
}'
|
查看啟動範本
1
2
3
4
5
6
| # 列出所有啟動範本
aws ec2 describe-launch-templates
# 查看特定啟動範本的詳細資訊
aws ec2 describe-launch-template-versions \
--launch-template-name my-web-app-template
|
建立 Auto Scaling 群組
接下來,使用啟動範本建立 Auto Scaling 群組。
1
2
3
4
5
6
7
8
9
10
11
| # 建立 Auto Scaling 群組
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name my-web-app-asg \
--launch-template LaunchTemplateName=my-web-app-template,Version='$Latest' \
--min-size 2 \
--max-size 10 \
--desired-capacity 2 \
--vpc-zone-identifier "subnet-0123456789abcdef0,subnet-0fedcba9876543210" \
--health-check-type ELB \
--health-check-grace-period 300 \
--tags Key=Environment,Value=Production,PropagateAtLaunch=true
|
查看 Auto Scaling 群組狀態
1
2
3
4
5
6
| # 查看 Auto Scaling 群組
aws autoscaling describe-auto-scaling-groups \
--auto-scaling-group-names my-web-app-asg
# 查看執行個體狀態
aws autoscaling describe-auto-scaling-instances
|
設定擴展政策
Auto Scaling 提供三種主要的擴展政策類型。
目標追蹤擴展政策 (Target Tracking Scaling)
最簡單且推薦的擴展方式,自動調整以維持目標指標值。
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 建立 CPU 使用率目標追蹤政策
aws autoscaling put-scaling-policy \
--auto-scaling-group-name my-web-app-asg \
--policy-name cpu-target-tracking-policy \
--policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ASGAverageCPUUtilization"
},
"TargetValue": 50.0,
"ScaleOutCooldown": 300,
"ScaleInCooldown": 300
}'
|
步進擴展政策 (Step Scaling)
根據警報嚴重程度進行不同幅度的擴展。
1
2
3
4
5
6
7
8
9
10
11
12
| # 建立步進擴展政策
aws autoscaling put-scaling-policy \
--auto-scaling-group-name my-web-app-asg \
--policy-name step-scaling-policy \
--policy-type StepScaling \
--adjustment-type ChangeInCapacity \
--step-adjustments '[
{"MetricIntervalLowerBound": 0, "MetricIntervalUpperBound": 20, "ScalingAdjustment": 1},
{"MetricIntervalLowerBound": 20, "MetricIntervalUpperBound": 40, "ScalingAdjustment": 2},
{"MetricIntervalLowerBound": 40, "ScalingAdjustment": 3}
]' \
--metric-aggregation-type Average
|
簡單擴展政策 (Simple Scaling)
最基本的擴展政策,每次調整固定數量的執行個體。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 建立向外擴展政策
aws autoscaling put-scaling-policy \
--auto-scaling-group-name my-web-app-asg \
--policy-name scale-out-policy \
--scaling-adjustment 2 \
--adjustment-type ChangeInCapacity \
--cooldown 300
# 建立向內縮減政策
aws autoscaling put-scaling-policy \
--auto-scaling-group-name my-web-app-asg \
--policy-name scale-in-policy \
--scaling-adjustment -1 \
--adjustment-type ChangeInCapacity \
--cooldown 300
|
動態擴展與排程擴展
排程擴展 (Scheduled Scaling)
適用於可預測的流量模式,例如每日尖峰時段。
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 設定每日上午 9 點擴展
aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name my-web-app-asg \
--scheduled-action-name scale-out-morning \
--recurrence "0 9 * * *" \
--desired-capacity 5
# 設定每日晚上 10 點縮減
aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name my-web-app-asg \
--scheduled-action-name scale-in-night \
--recurrence "0 22 * * *" \
--desired-capacity 2
|
健康檢查設定
Auto Scaling 支援 EC2 和 ELB 兩種健康檢查類型。
1
2
3
4
5
| # 更新健康檢查設定
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name my-web-app-asg \
--health-check-type ELB \
--health-check-grace-period 300
|
健康檢查注意事項
- EC2 健康檢查:僅檢查執行個體是否正在運行
- ELB 健康檢查:檢查應用程式是否正常回應請求
- 健康檢查寬限期:新執行個體啟動後,在此期間內不會被標記為不健康
與 ALB 整合
將 Auto Scaling 群組與 Application Load Balancer 整合。
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 建立目標群組
aws elbv2 create-target-group \
--name my-web-app-tg \
--protocol HTTP \
--port 80 \
--vpc-id vpc-0123456789abcdef0 \
--health-check-path /health \
--health-check-interval-seconds 30
# 將 Auto Scaling 群組附加至目標群組
aws autoscaling attach-load-balancer-target-groups \
--auto-scaling-group-name my-web-app-asg \
--target-group-arns arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-web-app-tg/1234567890abcdef
|
監控與故障排除
查看擴展活動
1
2
3
4
| # 查看擴展活動歷史
aws autoscaling describe-scaling-activities \
--auto-scaling-group-name my-web-app-asg \
--max-items 10
|
常見問題排除
- 執行個體無法啟動:檢查啟動範本配置、子網路設定、安全群組規則
- 擴展緩慢:調整冷卻時間或使用步進擴展政策
- 健康檢查失敗:確認應用程式正確回應健康檢查端點
CloudWatch 指標監控
1
2
3
4
5
6
7
8
9
| # 查看 Auto Scaling 群組指標
aws cloudwatch get-metric-statistics \
--namespace AWS/AutoScaling \
--metric-name GroupTotalInstances \
--dimensions Name=AutoScalingGroupName,Value=my-web-app-asg \
--start-time 2023-12-24T00:00:00Z \
--end-time 2023-12-24T23:59:59Z \
--period 3600 \
--statistics Average
|
最佳實踐
- 使用多個可用區域:確保高可用性
- 設定適當的冷卻時間:避免過度擴展或縮減
- 配置通知:透過 SNS 接收擴展事件通知
- 定期審查擴展政策:根據實際流量模式調整
參考資料