无法使 CloudFormation AutoScalingGroup 正常工作

无法使 CloudFormation AutoScalingGroup 正常工作

我正在尝试为 EC2 创建 AutoScalingGroup。我不断收到以下错误:

收到 1 个 SUCCESS 信号中的 0 个。无法满足 100% MinSuccessfulInstancesPercent 要求

EC2 实例正在创建,但它尚未获取公共 IP 或 DNS。

我发现关于同一问题的其他线程,其中一个答案提到“验证将安装 AutoScalingGroup 实例的子网是否可以使用 NAT 网关或 Internet 网关连接到 Internet。” 我相信这是问题所在,但我不确定如何解决它。

我的 VPC 已经有互联网网关,但我不确定如何告诉我的 AutoScaling 组使用它。

  PrivateSubnetOne:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      MapPublicIpOnLaunch: false
      CidrBlock: !Ref PrivateSubnetOneCidr
      AvailabilityZone:
        Fn::Select:
        - '0'
        - Fn::GetAZs: ''

  PrivateSubnetTwo:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      MapPublicIpOnLaunch: false
      CidrBlock: !Ref PrivateSubnetTwoCidr
      AvailabilityZone:
        Fn::Select:
        - '1'
        - Fn::GetAZs: ''

  WebServerAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    DependsOn:
    - Db
    - ElasticacheCluster
    Properties:
      AvailabilityZones:
      - !GetAtt PrivateSubnetOne.AvailabilityZone
      - !GetAtt PrivateSubnetTwo.AvailabilityZone
      DesiredCapacity: 1
      HealthCheckType: 'ELB'
      HealthCheckGracePeriod: '300'
      MinSize: '1'
      MaxSize: '10'
      LaunchConfigurationName: !Ref WebServer
      LoadBalancerNames:
      - !Ref WebServerElasticLoadBalancer
      VPCZoneIdentifier:
      - !Ref PrivateSubnetOne
      - !Ref PrivateSubnetTwo
      Tags:
      - Key: Name
        Value: Web Server
        PropagateAtLaunch: true
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M
        Count: 1
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: 1
        MaxBatchSize: '1'
        PauseTime: PT5M
        WaitOnResourceSignals: 'true'

答案1

当您没有收到成功信号时,可能存在以下两种情况:

  1. EC2 实例从未发送成功信号
  2. 网络问题导致无法接收信号

调试此问题的最简单方法是连接到 EC2 服务器,以便您可以检查日志文件并运行手动测试。当我说“连接”时,我指的是 Linux 实例的 SSH、Windows 的 RDP 等。这需要 EC2 实例持续运行足够长的时间来调试问题。

调试问题时保持其运行的方法:

  1. 将 CreationPolicy 中的超时时间设置得更长。
  2. 删除 CreationPolicy,以便 CloudFormation 在未发送成功消息时不会失败
  3. 使用 OnFailure 属性 DO_NOTHING(而不是默认的 ROLLBACK)启动您的堆栈。

有多个问题可能导致网络连接失败,从而无法接收成功信号。

在这种情况下最有可能的是没有 SubnetRouteTableAssociation。如果您没有将子网与路由表关联,则子网将使用默认路由表。除非您手动配置,否则默认路由表不会与您的互联网网关或 NAT 网关关联。我假设您没有手动配置默认路由表,因为您尝试使用 CloudFormation 来避免手动更改。

以下是无法建立网络连接的其他一些可能性:

  1. 网络 ACL 的配置方式是阻止正在尝试的连接的出站数据包或入站数据包。任何一个数据包都会阻止成功的 TCP 连接发送数据。
  2. EC2 安全组已配置为阻止出站网络流量。
  3. EC2 实例正在使用巨型帧(大型网络 MTU),但网络中的服务器或路由器不支持它,并且您阻止了会告诉您的 EC2 实例调整其 MTU 的 ICMP 数据包。(不太可能,但我曾经遇到过一次)

相关内容