关于 aws-cloudformation-auto-scaling
面向使用 AWS CloudFormation 部署弹性基础设施的开发者,涵盖 EC2、ECS 和 Lambda 的自动扩缩配置。内容包括伸缩组、策略、生命周期钩子、监控及高可用性实践。
主要功能
- 01创建 EC2 自动扩缩组
- 02配置启动模板与扩缩策略
- 03为 ECS 服务和 Lambda 设置扩缩
- 04配置生命周期钩子与 CloudWatch 告警
- 05组织模板输出和跨堆栈引用
适用场景
- 01为 EC2 工作负载构建弹性容量
- 02按指标配置目标跟踪伸缩
- 03通过生命周期钩子管理实例终止
- 04为其他堆栈导出扩缩组信息
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-cloudformation-auto-scaling安装后在 Claude Code 中输入/aws-cloudformation-auto-scaling确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/constraints.mdexamples.mdreference.md详细介绍
AWS CloudFormation Auto Scaling
概述
使用 AWS CloudFormation 模板创建可用于生产环境的 Auto Scaling 基础设施。本技能涵盖 EC2、ECS 和 Lambda 的 Auto Scaling 组、启动配置、启动模板、扩缩策略、生命周期钩子,以及实现高可用性和成本优化的最佳实践。
使用场景
在以下情况下使用本技能:
- 为 EC2 实例创建 Auto Scaling 组
- 配置启动配置或启动模板
- 实施扩缩策略(阶梯式、目标跟踪、简单)
- 添加用于生命周期管理的生命周期钩子
- 为 ECS 服务创建扩缩配置
- 实施 Lambda 预置并发扩缩
- 使用参数、输出、映射和条件组织模板
- 使用导出/导入实现跨堆栈引用
- 使用混合实例策略实现多样性
说明
按照以下步骤使用 CloudFormation 创建 Auto Scaling 基础设施:
1. 定义参数
使用 AWS 专用参数类型指定容量和实例设置:
Parameters:
MinSize:
Type: Number
Default: 2
Description: Minimum number of instances
MaxSize:
Type: Number
Default: 10
Description: Maximum number of instances
DesiredCapacity:
Type: Number
Default: 2
Description: Desired number of instances
InstanceType:
Type: AWS::EC2::Instance::Type
Default: t3.micro
Description: EC2 instance type
AmiId:
Type: AWS::EC2::Image::Id
Description: AMI ID for instances
SubnetIds:
Type: List<AWS::EC2::Subnet::Id>
Description: Subnets for Auto Scaling group
2. 创建启动配置
定义实例启动设置:
Resources:
MyLaunchConfiguration:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
LaunchConfigurationName: !Sub "${AWS::StackName}-lc"
ImageId: !Ref AmiId
InstanceType: !Ref InstanceType
KeyName: !Ref KeyName
SecurityGroups:
- !Ref InstanceSecurityGroup
InstanceMonitoring: Enabled
UserData:
Fn::Base64: |
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
3. 创建 Auto Scaling 组
指定最小/最大/期望容量和网络配置:
Resources:
MyAutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: !Sub "${AWS::StackName}-asg"
MinSize: !Ref MinSize
MaxSize: !Ref MaxSize
DesiredCapacity: !Ref DesiredCapacity
VPCZoneIdentifier: !Ref SubnetIds
LaunchConfigurationName: !Ref MyLaunchConfiguration
TargetGroupARNs:
- !Ref MyTargetGroup
HealthCheckType: ELB
HealthCheckGracePeriod: 300
Tags:
- Key: Environment
Value: !Ref Environment
PropagateAtLaunch: true
4. 配置负载均衡器集成
设置 ALB 以分发流量:
Resources:
MyTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: !Sub "${AWS::StackName}-tg"
Port: 80
Protocol: HTTP
VpcId: !Ref VPCId
HealthCheckPath: /
TargetType: instance
MyLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: !Sub "${AWS::StackName}-alb"
Scheme: internet-facing
Type: application
Subnets:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
5. 添加扩缩策略
实施目标跟踪扩缩:
Resources:
TargetTrackingPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
PolicyName: !Sub "${AWS::StackName}-target-tracking"
PolicyType: TargetTrackingScaling
AutoScalingGroupName: !Ref MyAutoScalingGroup
TargetTrackingConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: ASGAverageCPUUtilization
TargetValue: 70
DisableScaleIn: false
6. 配置生命周期钩子
实施钩子,以便妥善管理实例:
Resources:
LifecycleHookTermination:
Type: AWS::AutoScaling::LifecycleHook
Properties:
LifecycleHookName: !Sub "${AWS::StackName}-termination-hook"
AutoScalingGroupName: !Ref MyAutoScalingGroup
LifecycleTransition: autoscaling:EC2_INSTANCE_TERMINATING
HeartbeatTimeout: 300
NotificationTargetARN: !Ref SNSTopic
RoleARN: !Ref LifecycleHookRole
7. 设置监控
配置用于触发扩缩的 CloudWatch 警报:
Resources:
HighCpuAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub "${AWS::StackName}-high-cpu"
MetricName: CPUUtilization
Namespace: AWS/EC2
Dimensions:
- Name: AutoScalingGroupName
Value: !Ref MyAutoScalingGroup
Statistic: Average
Period: 60
EvaluationPeriods: 3
Threshold: 70
ComparisonOperator: GreaterThanThreshold
8. 配置输出和跨堆栈引用
导出 ASG 配置,供其他堆栈使用:
Outputs:
AutoScalingGroupName:
Description: Name of the Auto Scaling Group
Value: !Ref MyAutoScalingGroup
Export:
Name: !Sub "${AWS::StackName}-AutoScalingGroupName"
AutoScalingGroupArn:
Description: ARN of the Auto Scaling Group
Value: !GetAtt MyAutoScalingGroup.AutoScalingGroupArn
Export:
Name: !Sub "${AWS::StackName}-AutoScalingGroupArn"
示例
完整的 Auto Scaling 模板
包含 VPC、ASG、ALB 和扩缩策略的端到端完整模板:
AWSTemplateFormatVersion: '2010-09-09'
Description: Auto Scaling Group with ALB integration
Parameters:
Environment:
Type: String
Default: production
InstanceType:
Type: AWS::EC2::Instance::Type
Default: t3.micro
AmiId:
Type: AWS::EC2::Image::Id
VpcId:
Type: AWS::EC2::VPC::Id
SubnetIds:
Type: List<AWS::EC2::Subnet::Id>
Resources:
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for ASG instances
VpcId: !Ref VpcId
SecurityGroupEgress:
- CidrIp: 0.0.0.0/0
IpProtocol: "-1"
TargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: !Sub "${AWS::StackName}-tg"
Port: 80
Protocol: HTTP
VpcId: !Ref VpcId
HealthCheckPath: /health
TargetType: instance
LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateName: !Sub "${AWS::StackName}-lt"
ImageId: !Ref AmiId
InstanceType: !Ref InstanceType
SecurityGroupIds:
- !Ref InstanceSecurityGroup
AutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: !Sub "${AWS::StackName}-asg"
MinSize: 2
MaxSize: 10
DesiredCapacity: 4
LaunchTemplate:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
VPCZoneIdentifier: !Ref SubnetIds
TargetGroupARNs:
- !Ref TargetGroup
HealthCheckType: ELB
HealthCheckGracePeriod: 300
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-instance"
PropagateAtLaunch: true
ScalingPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
PolicyName: !Sub "${AWS::StackName}-cpu-policy"
PolicyType: TargetTrackingScaling
AutoScalingGroupName: !Ref AutoScalingGroup
TargetTrackingConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: ASGAverageCPUUtilization
TargetValue: 70
Outputs:
AutoScalingGroupName:
Value: !Ref AutoScalingGroup
Export:
Name: !Sub "${AWS::StackName}-ASG-Name"
验证命令
在部署前验证模板并测试更改:
# Validate CloudFormation template
aws cloudformation validate-template --template-body file://template.yaml
# Create change set to preview changes
aws cloudformation create-change-set \
--stack-name my-asg-stack \
--template-body file://template.yaml \
--change-set-type CREATE
# Describe change set
aws cloudformation describe-change-set \
--stack-name my-asg-stack \
--change-set-name <change-set-id>
# Execute change set
aws cloudformation execute-change-set \
--stack-name my-asg-stack \
--change-set-name <change-set-id>
验证命令
部署后验证 ASG 的运行状况和配置:
# Describe Auto Scaling Groups
aws autoscaling describe-auto-scaling-groups \
--auto-scaling-group-names my-asg-stack-asg
# Check instance health
aws autoscaling describe-auto-scaling-instances \
--instance-ids <instance-id>
# Verify scaling policies
aws autoscaling describe-policies \
--auto-scaling-group-name my-asg-stack-asg
# Review scaling activities
aws autoscaling describe-scaling-activities \
--auto-scaling-group-name my-asg-stack-asg
限制和警告
资源限制
- ASG 最大规模:10000 个实例(如需更多实例,请申请提高限额)
- 每个账户最多 20 个启动配置(请改用启动模板)
- 每个 ASG 最多 50 个生命周期钩子
- 每个 ASG 最多 20 个扩缩策略(目标跟踪限额)
- 冷却时间默认值:300 秒(谨慎缩短)
运维警告
- 不要在一次更新中同时更新同一个 ASG 的启动配置和启动模板
- 始终使用
UpdatePolicy进行平稳更新和实例刷新 - 将
HealthCheckGracePeriod设置为不小于预计的实例初始化时间 - 生命周期钩子超时时间必须满足平稳关闭流程的需要
- Spot 实例:设置
InstanceMaintenancePolicy,以避免意外终止
安全警告
- 切勿将凭证硬编码;请使用 IAM 实例配置文件
- 使用 Auto Scaling 的服务关联角色(
aws-autoscaling.amazonaws.com) - 限制 ASG 描述权限,防止信息泄露
- EBS 加密所用的 KMS 密钥必须在与 ASG 相同的区域中创建
- 跨堆栈引用的导出名称在每个区域中都必须唯一
最佳实践
高可用性
- 将实例分布到多个 AZ
- 使用带运行状况检查的 ALB 实现自动路由
- 实施生命周期钩子,实现平稳关闭
- 配置适当的终止策略
- 使用混合实例策略实现多样性
- 设置适当的运行状况检查宽限期
成本优化
- 对可容错工作负载使用 Spot 实例
- 为实例配置适当的规格
- 配置积极的缩减策略
- 针对可预测的模式使用计划扩缩
- 定期监控和优化
- 设置适当的最小容量,避免过度预置
监控
- 为关键指标创建 CloudWatch 警报
- 根据指标实施扩缩策略
- 使用生命周期挂钩进行日志记录和分析
- 配置 SNS 通知以接收扩缩事件
- 实施详细监控以便排查问题
- 使用多种扩缩策略以实现最佳响应
安全
- 使用遵循最小权限原则的 IAM 角色
- 使用 KMS 加密 EBS 卷
- 配置限制严格的安全组
- 使用配置了适当子网的 VPC
- 使用 Parameter Store 管理敏感配置
- 避免使用宽泛的托管策略(使用特定权限)
- 配置适当的实例配置文件
参考资料
如需详细的实施指导,请参阅:
- constraints.md - 资源限制(ASG 限制、扩缩策略限制、生命周期挂钩限制)、扩缩约束(冷却时间、运行状况检查宽限期、最小/最大容量)、运维约束(混合实例策略、预测性扩缩、实例刷新)、安全约束(IAM 角色、服务关联角色、KMS 权限)以及成本考量(Spot 实例终止、过度预置、扩缩频率)
相关资源
评论
支持 Markdown