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



是否有人成功地将应用程序自动缩放组与 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 运行状况检查中工作正常,但是当我切换到 ELB 运行状况检查时,实例正在耗尽,ASG 会启动一个新实例。

梅西·

  • 我会像这样进行故障排除:
    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要求的更多信息,请参阅此 SO 答案。
    6. 现在,当您创建堆栈时,它仍然会失败,但现在我们可以对其进行故障排除。我们在步骤 2 中将运行状况检查类型保留为 ELB 的原因是,我们实际上希望 ASG 替换运行状况检查失败的实例,我们可以在控制台的 ASG 的"活动历史记录"选项卡中找出原因。
    7. 很有可能
    8. ,你会看到一条比CloudFormation返回的消息更有意义的消息。
    9. 现在您已经收到该错误消息,请将 ASG 的运行状况检查类型从控制台更改为 EC2,因为我们不希望 ASG 开始 EC2 实例的"启动和终止"循环
    10. 现在,登录到您的 EC2 实例并查找访问日志,以查找来自 ELB 运行状况检查的命中。在 httpd 中,成功的运行状况检查会获得 HTTP 408。
    11. 另请注意,如果ELB healtcheck类型为TCP:80,则服务器上没有任何端口冲突,如果您选择了HTTP:80,则已指定路径/文件以及ping目标。
    12. 由于您的脚本也有一些用户数据,因此请查看/var/log/cfn-init.log 和其他条目以获取任何错误消息。一个简单的选择是,grep error /var/log/*
    13. 现在,在这一点上,您只需要确保ELB运行状况检查成功并且ELB后面的实例"在服务",最重要的步骤是记录所有故障排除步骤,因为您永远不知道,您尝试过的众多步骤中的哪一步实际上修复了此运行状况检查。
    14. 一旦你能够找到原因,只需把它放在模板中,你应该很高兴。我看到许多模板在第 8 步出错。
    15. 另外,不要错过再次将 ASG 运行状况检查更改为 ELB。

相关内容

最新更新