微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决防止 Auto Scaling 组向 CloudFormation 报告成功,直到 EC2 和 ELB 运行状况检查至少通过一次

我正在使用 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。