AWS不健康的目标组实例。

0

【以下的问题经过翻译处理】 我正在 Udacity 从事一个 AWS 项目,并部署一个具有弹性负载均衡器、自动缩放组、侦听器、侦听器规则、安全组和目标组的基础设施。我的问题是目标组中实例的健康检查状态总是导致不健康的实例,因此我无法调用负载均衡器 DNS url 或实例的 ip。我总是有 502 坏网关。我做错了什么。这是我的代码:

描述:>
  xxx / 优达学城 2023

参数:
  环境名称:
    描述:将作为资源名称前缀的环境名称
    类型:字符串
  我的启动模板版本号:
    类型:字符串
    默认值:1

资源:
  LBSec 组:
    类型:AWS::EC2::SecurityGroup
    特性:
      GroupDescription:允许 http 到我们的负载均衡器
      VpcId:
        Fn::导入值:
          !Sub "${EnvironmentName}-VPCID"
      安全组入口:
      - IP协议:TCP
        从港口:80
        到港口:80
        CidrIp:0.0.0.0/0
      SecurityGroupEgress:安全组。
      - IP协议:TCP
        从港口:80
        到港口:80
        CidrIp:0.0.0.0/0
  网络服务器安全组:
    类型:AWS::EC2::SecurityGroup
    特性:
      GroupDescription:仅允许从本地访问我们的主机和 SSH
      VpcId:
        Fn::导入值:
          !Sub "${EnvironmentName}-VPCID"
      安全组入口:
      - IP协议:TCP
        从端口:8080
        至港口:8080
        CidrIp:0.0.0.0/0
      - IP协议:TCP
        从港口:22
        至港口:22
        CidrIp:0.0.0.0/0
      安全组出口:
      - IP协议:TCP
        从端口:0
        ToPort: 65535 #结束端口
        CidrIp:0.0.0.0/0
  我的 Web 应用程序启动模板:
    类型:AWS::EC2::LaunchTemplate
    特性:
      启动模板数据:
        用户数据:
          Fn::Base64: !Sub |
            #!/bin/庆典
            易于获取更新-y
            apt-get 安装 apache2 -y
            systemctl 启动apache2.service
            cd /var/www/html
            echo "Udacity 演示 Web 服务器启动并运行!" > 索引.html
        图片 ID:ami-0a261c0e5f51090b1
        密钥名称:mykey
        安全组 ID:
          - sg-01ad772aba0f98d98 # 然后记下来自 AWS 控制台的安全组 ID:使用 Web 服务器 SecurityGroup ID
        InstanceType: t3.medium # Amazon 对特定机器的命名法,即多少 RAM 和哪个 CPU
        # 在这里指定我们需要 10 GB 的硬盘驱动器给这台机器,一个驱动器就足够了
        块设备映射:
          - DeviceName: "/dev/sdk" # 我把硬盘放在哪里,你可以创建文件夹的挂载点
            EB:
              VolumeSize: '10' # 这台机器需要多少硬盘空间
  网络应用组:
    类型:AWS::AutoScaling::AutoScalingGroup
    特性:
      VPC 区域标识符:
        - Fn::ImportValue: !Sub "${EnvironmentName}-PUB-NETS"
      启动模板:
        LaunchTemplateId: !Ref myWebAppLaunchTemplate # 强制
        版本:!Ref myLaunchTemplateVersionNumber # mandantory
      最小尺寸:“3”
      最大尺寸:“5”
      TargetGroupARN:
      - 参考:WebAppTargetGroup
  WebAppLB:
    类型:AWS::ElasticLoadBalancingV2::LoadBalancer
    特性:
      子网:
      - Fn::ImportValue: !Sub "${EnvironmentName}-PUB1-SN"
      - Fn::ImportValue: !Sub "${EnvironmentName}-PUB2-SN"
      安全组:
      - 参考:LBSecGroup
  听众:
    类型:AWS::ElasticLoadBalancingV2::Listener
    特性:
      默认操作:
      类型:前锋
        TargetGroupArn:
          参考:WebAppTargetGroup
      负载均衡器Arn:
        参考:WebAppLB
      端口:'80'
      协议:HTTP
  ALBListenerRule:
    类型:AWS::ElasticLoadBalancingV2::ListenerRule
    特性:
      动作:
      - type: forward #转发请求到指定的目标组
        TargetGroupArn: !Ref 'WebAppTargetGroup'
      状况:
      - 字段:路径模式
        值:[/]
      ListenerArn: !Ref 'Listener'
      优先级:1
  Web 应用目标组:
    类型:AWS::ElasticLoadBalancingV2::TargetGroup
    特性:
      HealthCheckIntervalSeconds:30
      健康检查路径:/
      健康检查协议:HTTP
      健康检查超时秒数:15
      健康阈值计数:2
      不健康阈值计数:5
      端口:8080
      协议:HTTP
      VpcId: #资源创建在哪个VPC
        Fn::导入值:
          Fn::Sub: "${EnvironmentName}-VPCID"


在创建上述基础设施之前,我需要在下面创建堆栈:

参数:
    环境名称:
        描述:将作为资源名称前缀的环境名称
        类型:字符串

    VpcCIDR:
        说明:请输入此 VPC 的 IP 范围(CIDR 表示法)
        类型:字符串
        默认值:10.0.0.0/16

    公共子网 1CIDR:
        说明:请输入第一个 Availab 中公共子网的 IP 范围(CIDR 表示法)功能区
        类型:字符串
        默认值:10.0.0.0/24

    公共子网 2CIDR:
        说明:请输入第二个可用区中公共子网的 IP 范围(CIDR 表示法)
        类型:字符串
        默认值:10.0.1.0/24

    私有子网 1CIDR:
        说明:请输入第一个可用区中私有子网的 IP 范围(CIDR 表示法)
        类型:字符串
        默认值:10.0.2.0/24
    私有子网 2CIDR:
        说明:请输入第二个可用区中私有子网的 IP 范围(CIDR 表示法)
        类型:字符串
        默认值:10.0.3.0/24
资源:
    专有网络:
        类型:AWS::EC2::VPC
        特性:
            CidrBlock: !Ref VpcCIDR
            EnableDnsHostnames: true
            标签:
                - 关键:姓名
                  值:!Ref 环境名称
    互联网网关:
        类型:AWS::EC2::InternetGateway
        特性:
            标签:
                - 关键:姓名
                  值:!Ref 环境名称
    互联网网关附件:
        类型:AWS::EC2::VPCGatewayAttachment
        特性:
            InternetGatewayId: !Ref InternetGateway
            VpcId: !Ref VPC # 引用之前创建的VPC

    # 在 AZ0 和 AZ1 中分别创建 2 个公共子网,除了 MapPublicIpOnLaunch 字段中的更改值:true。
    # 将此字段标记为 True 将启用公有子网的自动分配公有 IP 地址字段

    公共子网 1:
        类型:AWS::EC2::子网
        特性:
            VpcId: !Ref VPC # 引用之前创建的VPC
            AvailabilityZone: !Select [0, !GetAZs ""]
            CidrBlock: !Ref PublicSubnet1CIDR # 引用 PublicSubnet1CIDR 参数
            MapPublicIpOnLaunch: true # 子网是否自动获取 IP 地址
            标签:# 使用标签命名您的子网,以便在您创建许多子网时进行跟踪。
                - 关键:姓名
                  值:!Sub ${EnvironmentName} 公共子网 (AZ1)

    公共子网 2:
        类型:AWS::EC2::子网
        特性:
            VpcId: !Ref VPC # 引用之前创建的VPC
            AvailabilityZone: !Select [1, !GetAZs ""]
            CidrBlock: !Ref PublicSubnet2CIDR # 引用 PublicSubnet2CIDR 参数
            MapPublicIpOnLaunch:真
            标签:
                - 关键:姓名
                  值:!Sub ${EnvironmentName} 公共子网 (AZ2)

    私有子网 1:
        类型:AWS::EC2::子网
        特性:
            VpcId: !Ref VPC # 引用之前创建的VPC
            AvailabilityZone: !Select [0, !GetAZs ""] # 注意我们的私有子网不共享可用性区域。
            # 我们将它们分开,正如我们在上一课的图表中显示的那样。
            # 为此,!GetAZs‘’ 函数获取您所在地区的可用区列表,这些可用区的索引为 0、1 等。
            # 然后,!select [0, !GetAZs‘’] 只返回第一个 AZ。
            CidrBlock: !Ref PrivateSubnet1CIDR # 引用 PrivateSubnet1CIDR 参数
            MapPublicIpOnLaunch:假
            标签:
                - 关键:姓名
                  值:!Sub ${EnvironmentName} 私有子网 (AZ1)

    私有子网 2:
        类型:AWS::EC2::子网
        特性:
            VpcId: !Ref VPC # 引用之前创建的VPC
            AvailabilityZone: !Select [1, !GetAZs ""] # the!Select [ 0, !GetAZs '' ] 返回您所在地区所有可用区列表中的第一个可用区。
            # 同样,对于 PrivateSubnet2,!Select [ 1, !GetAZs '' ] 将返回第二个 AZ。
            CidrBlock: !Ref PrivateSubnet2CIDR # 引用 PrivateSubnet2CIDR 参数
            MapPublicIpOnLaunch:假
            标签:
                - 密钥:NameAW
                  值:!Sub ${EnvironmentName} 私有子网 (AZ2)

# AWS::EC2::EIP中的EIP代表Elastic IP。
# 这将为我们提供一个已知/恒定的 IP 地址,而不是一次性或不断变化的 IP 地址。
# 当你有依赖于特定 IP 地址的应用程序时,这很重要
    NatGateway1EIP:
        类型:AWS::EC2::EIP
        取决于:InternetGatewayAttachment
        特性:
            域:vpc

# 使用 DependsOn 属性来保护您的依赖项不会在没有适当要求的情况下被创建。
# 在上面的场景中,EIP 分配只会在 InternetGatewayAttachment 完成后发生
    NatGateway2EIP:
        类型:AWS::EC2::EIP
        取决于:InternetGatewayAttachment
        特性:
            域:vpc

    NatGateway1:
        类型:AWS::EC2::NatGateway
        特性:
            AllocationId: !GetAtt NatGateway1EIP.AllocationId
            SubnetId: !Ref PublicSubnet1

    NatGateway2:
        类型:AWS::EC2::NatGateway
        特性:
            AllocationId: !GetAtt NatGateway2EIP.AllocationIdSubnetId: !Ref PublicSubnet2

    公共路由表:
        类型:AWS::EC2::路由表
        特性:
            VpcId: !Ref VPC
            标签:
                - 关键:姓名
                  值:!Sub ${EnvironmentName} 公共路由

    默认公共路由:
        类型:AWS::EC2::路由
        DependsOn: InternetGatewayAttachment # 不需要,取决于 InternetGatewayAttachment 是否正常工作。
        # 仅在 InternetGateway 附加到 VPC 时使用,在创建这些资源期间的任何其他时间不使用
        特性:
            RouteTableId: !Ref PublicRouteTable
            DestinationCidrBlock: 0.0.0.0/0 # 规则意味着:如果你将流量路由到任何地址(0.0.0.0 是通配符地址或所有地址),
            # 它们将被路由到 GatewayId InternetGateway 中的这个特定资源
            # 0.0.0.0 表示只将流量发送到 InternetGateway
            # 目标匹配和通配符地址 (0.0.0/0) 来引用所有流量。
            # 当我们使用通配符地址 0.0.0.0/0 时,我们说的是任何发往世界上任何 IP 地址的地址,
            # 发送给引用的GatewayId
            GatewayId: !Ref InternetGateway

#VPC 有带路由的路由表,但可以有多个子网。 SubnetRouteTableAssociation 将规则关联到子网
    公共子网 1 路由表关联:
        类型:AWS::EC2::SubnetRouteTableAssociation
        特性:
            RouteTableId: !Ref PublicRouteTable
            SubnetId: !Ref PublicSubnet1

    公共子网 2 路由表关联:
        类型:AWS::EC2::SubnetRouteTableAssociation
        特性:
            RouteTableId: !Ref PublicRouteTable
            SubnetId: !Ref PublicSubnet2
    

    私人路由表 1:
        类型:AWS::EC2::路由表
        特性:
            VpcId: !Ref VPC
            标签:
                - 关键:姓名
                  值:!Sub ${EnvironmentName} 专用路由 (AZ1)

    # 路由 DefaultPrivateRoute1 附加到 PrivateRouteTable1 并通过 NatGateway1 路由
    # 将流量路由到通配符地址 0.0.0.0/0 然后将此流量发送到 NatGateway1,不要出口到外面
    # 保留 VPC 内私有子网的流量
    默认专用路由 1:
        类型:AWS::EC2::路由
        特性:
            RouteTableId: !Ref PrivateRouteTable1
            DestinationCidrBlock:0.0.0.0/0
            NatGatewayId: !Ref NatGateway1
    # 私有子网内的服务器没有 IP 地址
    # 即使将它们放在公共子网上,如果没有 IP 地址也无法访问它们

    # 将 PrivateSubnet1 与路由表 PrivateRouteTable1 中的规则 DefaultPrivateRoute1 相关联
    PrivateSubnet1RouteTableAssociation:
        类型:AWS::EC2::SubnetRouteTableAssociation
        特性:
            RouteTableId: !Ref PrivateRouteTable1
            SubnetId: !Ref PrivateSubnet1

    私有路由表 2:
        类型:AWS::EC2::路由表
        特性:
            VpcId: !Ref VPC
            标签:
                - 关键:姓名
                  值:!Sub ${EnvironmentName} 专用路由 (AZ2)

    默认专用路由 2:
        类型:AWS::EC2::路由
        特性:
            RouteTableId: !Ref PrivateRouteTable2
            DestinationCidrBlock:0.0.0.0/0
            NatGatewayId: !Ref NatGateway2

    PrivateSubnet2RouteTableAssociation:
        类型:AWS::EC2::SubnetRouteTableAssociation
        特性:
            RouteTableId: !Ref PrivateRouteTable2
            SubnetId: !Ref PrivateSubnet2

输出:
# 在其他脚本或文件中使用此资源
# 我们将返回 VPC 的 ID 以及我们的环境名称:
    专有网络:
        描述:对创建的VPC的引用
        值:!Ref VPC # 引用之前创建的 VPC
        出口:
            Name: !Sub ${EnvironmentName}-VPCID # 从参数中替换 EnvironmentName

    公共子网:
        描述:公共子网列表
        Value: !Join [",", [!Ref PublicSubnet1, !Ref PublicSubnet2]] # join 表示将几个字符串放在一起
        出口:
            名称:!Sub ${EnvironmentName}-PUB-NETS
            # Ref 获取 PublicSubnet1 和 PublicSubnet2 的 ID

    私有子网:
        描述:私有子网列表
        值:!Join [",", [!Ref PrivateSubnet1, !Ref PrivateSubnet2]]
        出口:
            名称:!Sub ${EnvironmentName}-PRIV-NETS

    公共子网 1:
        说明:对第一个可用区中公共子网的引用
        值:!Ref PublicSubnet1
        出口:
            名称:!Sub ${EnvironmentName}-PUB1-SN

    公共子网 2:
        说明:对第二个可用区中公共子网的引用
        值:!Ref PublicSubnet2
        出口:
            名称:!Sub ${EnvironmentName}-PUB2-SN

    私有子网 1:
        说明:对 1st Avail 中私有子网的引用能力

profile picture
专家
已提问 6 个月前75 查看次数
1 回答
0

【以下的回答经过翻译处理】 看起来你没有配置Apache监听端口8080。

profile picture
专家
已回答 6 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则