我有一个AWS CloudFormation模板,该模板创建一个Application Load Balancer,将流量路由到由两个运行Apache的实例组成的目标组。
有时,当我创建堆栈时,两个运行状况检查都可以正常运行,如下所示:
但是有时,当我使用完全相同的模板创建堆栈时,一项或两项运行状况检查失败:
模板中用于创建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;
我猜这是某种资源计时问题,但我不确定。
答案 0 :(得分:0)
通常,当您引导实例时,好的做法是对实例使用cfn-signal和creation 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