【问题标题】:CloudFormation target group health checks are inconsistentCloudFormation 目标组运行状况检查不一致
【发布时间】:2020-10-10 19:44:23
【问题描述】:

我有一个 AWS CloudFormation 模板,它创建一个应用程序负载均衡器,将流量路由到由两个运行 Apache 的实例组成的目标组。

有时当我创建堆栈时,两个运行状况检查都很好,如下所示:

但其他时候,当我使用完全相同的模板创建堆栈时,一项或两项运行状况检查会失败:

创建 ALB 和实例的模板部分是:

 类型:AWS::ElasticLoadBalancingV2::LoadBalancer
    取决于:
      - Ec2InstanceA
      - Ec2InstanceB
    特性:
      IP地址类型:ipv4
      方案:面向互联网
      安全组:
        - !Ref InstanceSecurityGroup
      子网:
        - !Ref PublicSubnetA
        - !Ref PublicSubnetB
      标签:
        - 键:名称
          值:!Sub ${AWS::StackName}-ALB
      类型:应用
  听众:
    类型:AWS::ElasticLoadBalancingV2::Listener
    特性:
      默认操作:
        - 类型:前锋
          TargetGroupArn: !Ref MyTargetGroup
      LoadBalancerArn: !Ref MyApplicationLoadBalancer
      端口:'80'
      协议:HTTP

  我的目标组:
    类型:AWS::ElasticLoadBalancingV2::TargetGroup
    特性:
      健康检查启用:真
      端口:80
      协议:HTTP
      VpcId: !Ref VPC
      目标:
        - ID:!Ref Ec2InstanceA
        - ID:!Ref Ec2InstanceB
      目标类型:实例
  
  Ec2InstanceA:
    类型:AWS::EC2::Instance
    特性:
      实例类型:t2.micro
      ImageId:ami-0323c3dd2da7fb37d
      密钥名称:密钥对
      网络接口:
        - AssociatePublicIpAddress:真
          设备索引:0
          组集:
            - 参考:InstanceSecurityGroup
          子网 ID:
            参考:PrivateSubnetA
      用户数据:
        Fn::Base64:
          !子 |
              #!/bin/bash -ex
              须藤百胜安装-y httpd;
              sudo echo "

Hello CloudFormation A!!

" > /var/www/html/index.html; cd /var/www/html; 须藤 chmod 755 index.html; sudo 服务 httpd 启动; sudo chkconfig httpd on; Ec2InstanceB: 类型:AWS::EC2::Instance 特性: 实例类型:t2.micro ImageId:ami-0323c3dd2da7fb37d 密钥名称:密钥对 网络接口: - AssociatePublicIpAddress:真 设备索引:0 组集: - 参考:InstanceSecurityGroup 子网 ID: 参考:PrivateSubnetB 用户数据: Fn::Base64: !子 | #!/bin/bash -ex 须藤百胜安装-y httpd; sudo echo "

Hello CloudFormation B!!

" > /var/www/html/index.html; cd /var/www/html; 须藤 chmod 755 index.html; sudo 服务 httpd 启动; sudo chkconfig httpd on;

我猜这是某种资源计时问题,但我不太确定。

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation aws-application-load-balancer


    【解决方案1】:

    如果您正在使用 Autoscaling,请将此行添加到您的用户数据末尾 cfn-signal --exit-code $? --resource !!!AutoScalingGroup!!! --stack ${AWS::StackName} --region ${AWS::Region},以便您的服务器可以在 UserData 完成且没有错误时向 AWS 发送有关状态的信息。

    允许像@Marcin 写的那样,尝试使用 CreationPolicy 以便 AWS 知道等待良好信号的时间,在这种情况下为 10 分钟,如果 10 分钟内没有信号,AWS 将终止您的实例并重试。

    Type: AWS::AutoScaling::AutoScalingGroup
    CreationPolicy:
      ResourceSignal:
        Count: 2 --> DesiredCapacity number
        Timeout: 'PT10M'--> Time in minutes
    

    在某些 AWS ami-s CFN 工具上未安装,因此用于安装 CFN 信号工具:

    sudo apt-get install -y python3 python python3-pip python-pip
    sudo pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz
    

    【讨论】:

      【解决方案2】:

      通常,当您引导实例时,良好做法是为您的实例使用 cfn-signal 和 creation policy。

      这可确保 CloudFormation 仅在 UserData 完成且没有错误时将您的实例标记为成功创建。这也使得它等到它发生。

      因此,当 ALB 开始检查您的实例的运行状况时,您可以确定 UserData 已成功执行并且您的 apache 服务器已启动并运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-13
        • 2021-11-24
        • 1970-01-01
        • 2022-08-20
        • 2021-08-18
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        相关资源
        最近更新 更多