mcpField
A
aws-cloudformation-auto-scaling

aws-cloudformation-auto-scaling

github.com/giuseppe-trisciuoglio云与 DevOps36565 次安装7 周前更新
代码仓库

关于 aws-cloudformation-auto-scaling

面向使用 AWS CloudFormation 部署弹性基础设施的开发者,涵盖 EC2、ECS 和 Lambda 的自动扩缩配置。内容包括伸缩组、策略、生命周期钩子、监控及高可用性实践。

主要功能

  1. 01创建 EC2 自动扩缩组
  2. 02配置启动模板与扩缩策略
  3. 03为 ECS 服务和 Lambda 设置扩缩
  4. 04配置生命周期钩子与 CloudWatch 告警
  5. 05组织模板输出和跨堆栈引用

适用场景

  1. 01为 EC2 工作负载构建弹性容量
  2. 02按指标配置目标跟踪伸缩
  3. 03通过生命周期钩子管理实例终止
  4. 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.md
examples.md
reference.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