将应用程序自动伸缩组与ELB运行状况检查结合使用

时间:2018-10-12 15:49:39

标签: amazon-cloudformation

任何人都可以成功地将应用程序自动伸缩组与ELB运行状况检查一起使用。它一遍又一遍地替换实例。有办法防止这种情况吗?

我的模板如下:

Resources:
  ECSAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      AvailabilityZones:
        - Fn::Select:
          - '0'
          - Fn::GetAZs:
            Ref: AWS::Region
        - Fn::Select:
         - '1'
         - Fn::GetAZs:
             Ref: AWS::Region
      - Fn::Select:
         - '2'
         - Fn::GetAZs:
             Ref: AWS::Region
     VPCZoneIdentifier:
       - Fn::ImportValue: !Sub ${EnvironmentName}-PrivateEC2Subnet1
       - Fn::ImportValue: !Sub ${EnvironmentName}-PrivateEC2Subnet2
       - Fn::ImportValue: !Sub ${EnvironmentName}-PrivateEC2Subnet3
    HealthCheckGracePeriod: !Ref ASGHealthCheckGracePeriod
    HealthCheckType: !Ref ASGHealthCheckType
    LaunchTemplate:
      LaunchTemplateId: !Ref ECSLaunchTemplate
      Version: 1
    MetricsCollection:
      - Granularity: 1Minute
    ServiceLinkedRoleARN:
     !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling
    DesiredCapacity: !Ref ASGDesiredCapacity
    MinSize: !Ref ASGMinSize
    MaxSize: !Ref ASGMaxSize
    TargetGroupARNs:
    - Fn::ImportValue: !Sub ${EnvironmentName}-WebTGARN
      Fn::ImportValue: !Sub ${EnvironmentName}-DataTGARN
      Fn::ImportValue: !Sub ${EnvironmentName}-GeneratorTGARN
    TerminationPolicies:
    - OldestInstance

启动模板如下:

ECSLaunchTemplate:
  Type: AWS::EC2::LaunchTemplate
  Properties:
    LaunchTemplateName: ECSLaunchtemplate
    LaunchTemplateData:
      ImageId: !FindInMap [AWSRegionToAMI, !Ref "AWS::Region", AMI]
      InstanceType: !Ref InstanceType
      SecurityGroupIds:
      - Fn::ImportValue: !Sub ${EnvironmentName}-ECSInstancesSecurityGroupID
    IamInstanceProfile:
        Arn:
          Fn::ImportValue:
            !Sub ${EnvironmentName}-ecsInstanceProfileARN
    Monitoring:
      Enabled: true
    CreditSpecification:
      CpuCredits: standard
    TagSpecifications:
     - ResourceType: instance
       Tags:
       - Key: "keyname1"
         Value: "value1"
    KeyName:
      Fn::ImportValue:
        !Sub ${EnvironmentName}-ECSKeyPairName
    UserData:
      "Fn::Base64": !Sub
        - |
          #!/bin/bash
          yum update -y
          yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
          yum update -y aws-cfn-bootstrap hibagent
          /opt/aws/bin/cfn-init -v --region ${AWS::Region} --stack ${AWS::StackName} --resource ECSLaunchTemplate --region ${AWS::Region}
          /opt/aws/bin/cfn-signal -e $? --region ${AWS::Region} --stack ${AWS::StackName} --resource ECSAutoScalingGroup
          /usr/bin/enable-ec2-spot-hibernation
          echo ECS_CLUSTER=${ECSCluster} >> /etc/ecs/ecs.config
         PATH=$PATH:/usr/local/bin
        - ECSCluster:
            Fn::ImportValue:
              !Sub ${EnvironmentName}-ECSClusterName

负载均衡器配置如下:

ApplicationLoadBalancerInternet:
   Type: AWS::ElasticLoadBalancingV2::LoadBalancer
   Properties:
     Name: !Sub ${EnvironmentName}-${Project}-ALB-Internet
     IpAddressType: !Ref ELBIpAddressType
     Type: !Ref ELBType
     Scheme: internet-facing
     Subnets:
     - Fn::ImportValue:
        !Sub ${EnvironmentName}-PublicSubnet1
     - Fn::ImportValue:
        !Sub ${EnvironmentName}-PublicSubnet2
     - Fn::ImportValue:
        !Sub ${EnvironmentName}-PublicSubnet3
     SecurityGroups:
     - Fn::ImportValue:
        !Sub ${EnvironmentName}-ALBInternetSecurityGroupID

如前所述,它可以与EC2 Healthchecks一起正常工作,但是当我切换到ELB Healthchecks时,实例将耗尽,ASG会启动一个新实例。

Merci A

1 个答案:

答案 0 :(得分:0)

  • 我会像这样对它进行故障排除:
    1. 删除此堆栈。
    2. 编辑您的模板,并将ASG健康检查类型更改为ELB(目前)。
    3. 从CLI或控制台创建新堆栈。我建议使用CLI,因为您可能必须重新创建它,并且它比控制台要简单/快捷得多。 最重要的步骤是在堆栈失败时启用“禁用回滚”功能,否则,您将无法找出失败的原因
    4. 我相信您还将在此模板中创建一些IAM资源,因此示例CLI命令将作为您的快速参考: aws cloudformation create-stack --stack-name Name-of-your-stack --template-body file://template.json --tags Key=Name,Value=Your_Tag_Value --profile default --region region --capabilities CAPABILITY_NAMED_IAM --disable-rollback yes
    5. 有关CAPABILITY_NAMED_IAM要求的更多信息,请参见this答案。
    6. 现在,当您创建堆栈时,它仍然会失败,但是现在我们可以对其进行故障排除。我们在步骤2中将运行状况检查类型保留为ELB的原因是,我们实际上希望ASG替换运行状况检查失败的实例,并且可以从控制台的ASG的“活动历史记录”选项卡中找到原因。
    7. 很有可能,您会看到比CloudFormation返回的消息更有意义的消息。
    8. 现在您收到该错误消息,将ASG的运行状况检查类型从控制台更改为EC2,因为我们不希望ASG为EC2实例启动“启动并终止”循环
    9. 现在,登录到您的EC2实例并查找访问日志,以查找来自ELB运行状况检查的点击。在httpd中,成功的运行状况检查将获得HTTP 408。
    10. 还请注意,如果ELB healtcheck类型为TCP:80,则服务器上没有任何端口冲突;如果选择了HTTP:80,则您已指定路径/​​文件以及ping目标。
    11. 由于您的脚本也包含一些用户数据,因此,请同时查看/var/log/cfn-init.log和其他条目,以获取任何错误消息。一个简单的选择是grep error /var/log/*
    12. 现在,此时,您只需确保成功完成ELB运行状况检查,并确保ELB后面的实例“正在运行”,最重要的步骤是记录所有故障排除步骤,因为您从未知道,您尝试过的步骤中有哪一步实际上可以修复此健康检查。
    13. 一旦能够找到原因,只需将其放在模板中就可以了。我已经看到许多模板在第8步出错。
    14. 此外,请不要再次将ASG运行状况检查更改为ELB。