问题描述
我正在使用 CloudFormation (CF) 模板创建 Auto Scaling Group (ASG),并启用了 EC2 和 ELB 运行状况检查。我希望看到的是,在考虑 EC2 和 ELB 运行状况检查时,CF 不会将 ASG 标记为成功部署,直到 ASG 满足其最小实例数。但是,这不是我看到的行为。
例如,如果 ASG 中的第一个实例未能通过 EC2 运行状况检查,ASG 会按预期创建新实例,直到满足其最低要求。同时,从 CF 的角度来看,ASG 被列为 CREATE_IN_PROGRESS
资源。如果 ASG 从未达到其最小健康实例数,则 ASG 将无限期地保留在 CREATE_IN_PROGRESS
中。虽然不是理想的结果,但至少很明显存在问题,最终会引发人为干预。
但是,如果第一个实例通过了 EC2 运行状况检查但未通过 ELB 运行状况检查,则 ASG 会像以前一样创建新实例,直到满足其最低要求。然而,与此同时,从 CF 的角度来看,ASG 被列为 CREATE_COMPLETE
,甚至在 HealthCheckGracePeriod
过去之前也是如此。在 CF 堆栈部署并考虑自身 CREATE_COMPLETE
之后很久,ASG 仍在循环遍历从未满足 ELB 运行状况检查的实例。这是我想要防止的行为。
根据the Auto Scaling Health Check docs:
您的 Auto Scaling 组中的所有实例都以健康状态开始。除非 Amazon EC2 Auto Scaling 收到它们不健康的通知,否则假定实例是健康的。此通知可以来自以下一个或多个来源:Amazon EC2、Elastic Load Balancing (ELB) 或自定义运行状况检查。
此描述与我所看到的行为相匹配,因此 CF w/ASG 似乎按照设计/记录的方式运行,但在我看来,对两个配置标准之一的健康状况的急切报告似乎很乐观。在声称成功之前,我希望这两个标准至少通过一次。
以下是 ASG 的缩写 CF 模板片段:
Resources:
MyAppScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: !Ref InstanceName
CapacityRebalance: true
HealthCheckGracePeriod: 300 # seconds
HealthCheckType: ELB
LaunchTemplate:
LaunchTemplateId: !Ref MyAppLaunchTemplate
Version: !GetAtt MyAppLaunchTemplate.DefaultVersionNumber
MaxSize: !Ref MaxInstances
MinSize: !Ref MinInstances
TargetGroupARNs: [ !Ref MyAppTargetGroup ]
VPCZoneIdentifier: !Split [ ",",!Ref subnets ]
解决方法
如果您向 CF 中的 ASG 资源添加超时,则会产生所需的行为。它不仅防止了 EC2 运行状况检查失败的第一个场景中的无限期 CREATE_IN_PROGRESS
,还防止了 EC2 运行状况检查通过但 ELB 运行状况检查失败的第二个场景中的误导性 CREATE_COMPLETE
。>
这是应用了 10 分钟资源超时的更新模板片段:
Resources:
MyAppScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: !Ref InstanceName
CapacityRebalance: true
HealthCheckGracePeriod: 300 # seconds
HealthCheckType: ELB
LaunchTemplate:
LaunchTemplateId: !Ref MyAppLaunchTemplate
Version: !GetAtt MyAppLaunchTemplate.DefaultVersionNumber
MaxSize: !Ref MaxInstances
MinSize: !Ref MinInstances
TargetGroupARNs: [ !Ref MyAppTargetGroup ]
VPCZoneIdentifier: !Split [ ",",!Ref Subnets ]
CreationPolicy:
ResourceSignal:
Count: !Ref MinInstances
Timeout: PT10M