AWS: Получение 502 из балансировщика нагрузки приложений в экземпляр EC2

#amazon-web-services #amazon-ec2 #amazon-cloudformation #aws-security-group #aws-load-balancer

Вопрос:

У меня есть 2 экземпляра EC2 в 2 общедоступных подсетях. Экземпляры EC2 подключены к балансировщику нагрузки приложений в той же общедоступной подсети, что и экземпляры EC2. Группы безопасности для EC2 настроены на прием tcp-трафика только из группы безопасности, в которой находится балансировщик нагрузки.

Я получаю 502, когда попадаю в конечную точку балансировщиков нагрузки приложений.

Я развертываю с помощью CloudFormation. Вот соответствующий фрагмент кода.

 AWSTemplateFormatVersion: "2010-09-09"
Description: Deploy a 3-tier wordpress system. (Plublic and Private subnets and DB on RDS)

Parameters:
  VpcId:
    Description: VPC id
    Type: String
    Default: vpc-0b6a616f830dd7d5a

  PublicSubnetA:
    Description: Subnet Id where instance will create
    Type: String
    Default: subnet-0616a6183bee2b276

  PrivateSubnetA:
    Description: Subnet Id where instance will create
    Type: String
    Default: subnet-06784a19612a64444

  PublicSubnetB:
    Description: Subnet Id where instance will create
    Type: String
    Default: subnet-04f7e39ac1431f22a

  PrivateSubnetB:
    Description: Subnet Id where instance will create
    Type: String
    Default: subnet-0fa6aa79eaee582bf

  EC2KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
    Type: AWS::EC2::KeyPair::KeyName
    Default: test
    ConstraintDescription: must be the name of an existing EC2 KeyPair.

  EC2InstanceType:
    Description: EC2 instance type
    Type: String
    Default: t2.micro
    ConstraintDescription: must be a valid EC2 instance type.

  WebServerInstanceAMI:
    Description: EC2 instance type
    Type: AWS::EC2::Image::Id
    Default: ami-0210560cedcb09f07
    ConstraintDescription: must be an existing AMI ID.

  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: (d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})/(d{1,2})
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.

  Application:
    Description: Application Name
    Type: String
    AllowedPattern: "[A-Za-z0-9-] "
    Default: test

  Environment:
    AllowedValues: [preprod,prod]
    Default: preprod
    Description: The name of the Environment
    Type: String

Resources:
  LoadBalancerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VpcId
      GroupDescription: ELB Security Group
      SecurityGroupIngress:
        - FromPort: 80
          IpProtocol: tcp
          CidrIp: 0.0.0.0/0
          ToPort: 80
          Description: Allow from internet
      Tags:
        - Key: Name
          Value: !Sub '${Application}-loadbalancer-sg'
        - Key: Project
          Value: !Ref Application
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'SSH and Port 80'
      VpcId:
        Ref: VpcId
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref 'SSHLocation'
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupId:
            Ref: LoadBalancerSecurityGroup
      Tags:
        - Key: Name
          Value: !Sub '${Application}-webserver-sg'
        - Key: Project
          Value: !Ref Application
  LoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: ApplicationLoadBalancer
      Scheme: internet-facing
      Subnets:
        - !Ref PublicSubnetA
        - !Ref PublicSubnetB
      SecurityGroups:
        - !Ref LoadBalancerSecurityGroup
  LoadBalancerListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref ApplicationTargetGroup
  ApplicationTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 15
      HealthyThresholdCount: 3
      UnhealthyThresholdCount: 3
      HealthCheckPath: /index.html
      Matcher:
        HttpCode: '200'
      Name: ApplicationTargetGroup
      VpcId: !Ref VpcId
      Port: 80
      Protocol: HTTP
      TargetGroupAttributes:
        - Key: deregistration_delay.timeout_seconds
          Value: '20'
      Targets:
        - Id: !Ref WebServerInstance1
          Port: 80
        - Id: !Ref WebServerInstance2
          Port: 80
  WebServerInstance1:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref EC2InstanceType
      KeyName: !Ref EC2KeyName
      SubnetId: !Ref PublicSubnetA
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      ImageId: !Ref WebServerInstanceAMI
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          cd /tmp
          sudo yum update -y
          sudo yum install -y httpd
          echo "Welcome from the instance 1" > /var/www/html/index.html
          sudo -u root service httpd start
  WebServerInstance2:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref EC2InstanceType
      KeyName: !Ref EC2KeyName
      SubnetId: !Ref PublicSubnetB
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      ImageId: !Ref WebServerInstanceAMI
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          cd /tmp
          sudo yum update -y
          sudo yum install -y httpd
          echo "Welcome from the instance 2" > /var/www/html/index.html
          sudo -u root service httpd start
Outputs:
  LoadBalancerDnsName:
    Description: Load Balancer public facing DNS
    Export:
      Name: !Sub ${AWS::StackName}-LoadBaancer
    Value: !GetAtt LoadBalancer.DNSName
 

Я просматриваю ресурсы, развернутые в пользовательском интерфейсе консоли, и вижу правильные правила группы безопасности в экземплярах EC2. Я не вижу, когда у ALB возникнут проблемы с отправкой сообщений в экземпляры EC2.

Вопрос: Почему я получаю ошибку 502, когда я попадаю в конечную точку ALBs?

Комментарии:

1. Вы проверили, запущен ли веб-сервер?

2. Как насчет конфигурации vpc? Это пользовательский vpc?

3. @MarkoE ваше право, веб-сервер не работал. Есть идеи, почему мой скрипт пользовательских данных не запустил сервер?

4. Можете ли вы предоставить полную информацию о шаблоне? VPC? Вы даже не указали, какой AMI вы используете.

5. Глядя на часть пользовательских данных, я бы, возможно, переключился с sudo -u root service httpd start на sudo systemctl start httpd .

Ответ №1:

Я развернул ваш шаблон в своем VPC. Шаблон отлично работает и работает без каких-либо проблем, включая ваш балансировщик нагрузки и веб-сайт.

Таким образом, все, что вызывает ваши проблемы, находится за пределами этого шаблона. Вероятно, определение VPC неверно, но оно не показано. Вы можете задать новый вопрос с подробностями настройки вашего VPC, если хотите.