CloudFormation目标组运行状况检查不一致

时间:2020-06-20 17:14:16

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

我有一个AWS CloudFormation模板,该模板创建一个Application Load Balancer,将流量路由到由两个运行Apache的实例组成的目标组。

有时,当我创建堆栈时,两个运行状况检查都可以正常运行,如下所示: enter image description here

但是有时,当我使用完全相同的模板创建堆栈时,一项或两项运行状况检查失败: enter image description here

模板中用于创建ALB和实例的部分为:

    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    DependsOn: 
      - Ec2InstanceA
      - Ec2InstanceB
    Properties:
      IpAddressType: ipv4
      Scheme: internet-facing
      SecurityGroups:
        - !Ref InstanceSecurityGroup
      Subnets:
        - !Ref PublicSubnetA
        - !Ref PublicSubnetB
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-ALB
      Type: application
  Listener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref MyTargetGroup
      LoadBalancerArn: !Ref MyApplicationLoadBalancer
      Port: '80'
      Protocol: HTTP

  MyTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties: 
      HealthCheckEnabled: true
      Port: 80
      Protocol: HTTP
      VpcId: !Ref VPC
      Targets: 
        - Id: !Ref Ec2InstanceA
        - Id: !Ref Ec2InstanceB
      TargetType: instance
  
  Ec2InstanceA:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-0323c3dd2da7fb37d
      KeyName: KeyPair
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          GroupSet:
            - Ref: InstanceSecurityGroup
          SubnetId:
            Ref: PrivateSubnetA
      UserData:
        Fn::Base64:                                
          !Sub |
              #!/bin/bash -ex
              sudo yum install -y httpd;
              sudo echo "<html><h1>Hello CloudFormation A!!<h1></html>" > /var/www/html/index.html;
              cd /var/www/html;
              sudo chmod 755 index.html;
              sudo service httpd start;
              sudo chkconfig httpd on;
  Ec2InstanceB:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-0323c3dd2da7fb37d
      KeyName: KeyPair
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          GroupSet:
            - Ref: InstanceSecurityGroup
          SubnetId:
            Ref: PrivateSubnetB
      UserData:
        Fn::Base64:                               
          !Sub |
              #!/bin/bash -ex
              sudo yum install -y httpd;
              sudo echo "<html><h1>Hello CloudFormation B!!<h1></html>" > /var/www/html/index.html;
              cd /var/www/html;
              sudo chmod 755 index.html;
              sudo service httpd start;
              sudo chkconfig httpd on;

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

2 个答案:

答案 0 :(得分:0)

通常,当您引导实例时,好的做法是对实例使用cfn-signalcreation policy

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

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

答案 1 :(得分:0)

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

allsow就像@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