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