防止 Auto Scaling 组向 CloudFormation 报告成功,直到 EC2 和 ELB 健康检查至少通过一次

Prevent Auto Scaling Group From Reporting Success to CloudFormation Until Both EC2 and ELB Health Checks Pass At Least Once

我正在使用 CloudFormation (CF) 模板创建一个 Auto Scaling 组 (ASG),并启用了 EC2 和 ELB 健康检查。我希望看到的是,在考虑 both 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

All instances in your Auto Scaling group start in the healthy state. Instances are assumed to be healthy unless Amazon EC2 Auto Scaling receives notification that they are unhealthy. This notification can come from one or more of the following sources: Amazon EC2, Elastic Load Balancing (ELB), or a custom health check.

此描述与我所看到的行为相符,因此 CF w/ASG 似乎正在作为 designed/documented 运行,但在我看来,根据两个配置标准之一急切地报告健康状况似乎很乐观。我希望这两个标准至少通过一次才能宣布成功。

这是 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