Назад | Перейти на главную страницу

Не удалось подключить экземпляр к ALB

Я пытаюсь построить такую ​​систему:

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

AWSTemplateFormatVersion: 2010-09-09

Metadata:

  AWS::CloudFormation::Interface:

    ParameterGroups:
      - Label:
         default: "system"

Parameters:
  KeyNameA:
    Type: AWS::EC2::KeyPair::KeyName



  SSHLocation: 
      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})


Resources:

  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.1.0.0/16
      EnableDnsSupport: True
      EnableDnsHostnames: True
      InstanceTenancy: default
      Tags:
      - Key: Name
        Value: !Sub ${AWS::StackName}-VPC

  InternetGateway: 
    Type: AWS::EC2::InternetGateway 
    DependsOn: VPC 



  AttachGateway: 
    Type: AWS::EC2::VPCGatewayAttachment 
    Properties: 
      VpcId: !Ref VPC 
      InternetGatewayId: !Ref InternetGateway



  PublicSubnetA: 
    Type: AWS::EC2::Subnet 
    Properties: 
      VpcId: !Ref VPC
      CidrBlock: 10.1.10.0/24
      AvailabilityZone: !Select [ 0, !GetAZs ]
      MapPublicIpOnLaunch: True 
      Tags: 
      - Key: Name 
        Value: !Sub ${AWS::StackName}-Public-A



  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.1.30.0/24
      AvailabilityZone: !Select [ 1, !GetAZs ] 
      MapPublicIpOnLaunch: True
      Tags: 
      - Key: Name 
        Value: !Sub ${AWS::StackName}-Public-B



  PrivateSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.1.20.0/24
      MapPublicIpOnLaunch: False
      AvailabilityZone: !Select [ 0, !GetAZs ] 
      Tags: 
      - Key: Name 
        Value: !Sub ${AWS::StackName}-Private-A



  PublicRouteTable: 
    Type: AWS::EC2::RouteTable 
    Properties: 
      VpcId: !Ref VPC
      Tags: 
      - Key: Name 
        Value: Public 




  PublicRoute:  
    Type: AWS::EC2::Route 
    DependsOn: AttachGateway 
    Properties: 
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0 
      GatewayId: !Ref InternetGateway


  PrivateRouteTable: 
    Type: AWS::EC2::RouteTable 
    Properties: 
      VpcId: !Ref VPC 
      Tags: 
      - Key: Name 
        Value: Private 



  PrivateRoute: 
    Type: AWS::EC2::Route 
    Properties: 
      RouteTableId: !Ref PrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0 
      NatGatewayId: !Ref NATGateway


  NATGateway: 
    Type: AWS::EC2::NatGateway  
    Properties: 
      AllocationId: !GetAtt ElasticIPAddress.AllocationId
      SubnetId: !Ref PublicSubnetA 


  ElasticIPAddress: 
    Type: AWS::EC2::EIP 
    Properties: 
      Domain: VPC



  PublicSubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation 
    Properties: 
      SubnetId: !Ref PublicSubnetA 
      RouteTableId: !Ref PublicRouteTable


  PublicSubnetBRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation 
    Properties: 
      SubnetId: !Ref PublicSubnetB 
      RouteTableId: !Ref PublicRouteTable


  PrivateSubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation 
    Properties: 
      SubnetId: !Ref PrivateSubnetA 
      RouteTableId: !Ref PrivateRouteTable



  TargetGroup:  
    Type: AWS::ElasticLoadBalancingV2::TargetGroup  
    Properties:  
      VpcId: !Ref VPC
      Name: WebInstanceTargetGroup  
      Protocol: HTTP  
      Port: 80  
      TargetType: instance  
      Targets:  
      - Id: !Ref WebInstance  
        Port: 80  



  ALBalancerSG:
    Type: AWS::EC2::SecurityGroup
    Properties: 
      GroupDescription: SG for ALBSG 
      GroupName: ALBSG
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp 
        FromPort: 80 
        ToPort: 80 
        CidrIp: 0.0.0.0/0 


  ALB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: PublicALB  
      Scheme: internet-facing  
      IpAddressType: ipv4  
      Subnets:  
        - !Ref PublicSubnetA
        - !Ref PublicSubnetB
      SecurityGroups:  
        - !Ref ALBalancerSG  

  Listener:  
    Type: AWS::ElasticLoadBalancingV2::Listener  
    Properties:  
      LoadBalancerArn: !Ref ALB  
      Port: 80  
      Protocol: HTTP  
      DefaultActions:  
        - TargetGroupArn: !Ref TargetGroup  
          Type: forward  



  WebInstanceSecurityGroup: 
    Type: AWS::EC2::SecurityGroup 
    Properties: 
      GroupDescription: SG for WebInstance 
      GroupName: WebSG
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp 
        FromPort: 80 
        ToPort: 80 
        CidrIp: 0.0.0.0/0 
        SourceSecurityGroupId: !Ref  ALBalancerSG
      - IpProtocol: tcp 
        FromPort: 22 
        ToPort: 22 
        CidrIp: !Ref SSHLocation



  WebInstance:
    Type: AWS::EC2::Instance
    Properties:
      BlockDeviceMappings: 
      - DeviceName: /dev/sda1 
        Ebs: 
          VolumeSize: 8 
          VolumeType: gp2
      DisableApiTermination: false
      InstanceType: !Ref InstanceTypeParameter
      KeyName: !Ref KeyNameA
      ImageId: ami-02b7cfebf005c915d
      SecurityGroupIds:
      - !Ref WebInstanceSecurityGroup
      SubnetId: !Ref PrivateSubnetA




  PrivateSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.1.90.0/24
      AvailabilityZone: !Select [ 0, !GetAZs ] 
      Tags: 
      - Key: Name 
        Value: !Sub ${AWS::StackName}-Private-B


  PrivateSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.1.110.0/24
      AvailabilityZone: !Select [ 1, !GetAZs ] 
      Tags: 
      - Key: Name 
        Value: !Sub ${AWS::StackName}-Private-C



  PrivateRouteTableRDS: 
    Type: AWS::EC2::RouteTable 
    Properties: 
      VpcId: !Ref VPC
      Tags: 
      - Key: Name 
        Value: Private2



  PrivateRouteRDS: 
    Type: AWS::EC2::Route 
    Properties: 
      RouteTableId: !Ref PrivateRouteTableRDS
      DestinationCidrBlock: 0.0.0.0/0 
      InstanceId: !Ref WebInstance



  PrivateSubnetBRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation 
    Properties: 
     SubnetId: !Ref PrivateSubnetB 
     RouteTableId: !Ref PrivateRouteTableRDS



  PrivateSubnetCRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation 
    Properties: 
     SubnetId: !Ref PrivateSubnetC 
     RouteTableId: !Ref PrivateRouteTableRDS



  DBSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: DBSubnetGroup for RDS instances
      SubnetIds:
        - Ref: PrivateSubnetB
        - Ref: PrivateSubnetC



  RDSSGIngress:
    Type: AWS::EC2::SecurityGroupIngress 
    Properties: 
      GroupId: !GetAtt VPC.DefaultSecurityGroup
      IpProtocol: tcp 
      FromPort: 5432
      ToPort: 5432
      CidrIp: 0.0.0.0/0 



  DBMasterInstance: 
    Type: AWS::RDS::DBInstance
    Properties: 
      DBInstanceIdentifier: DemoRDS
      DBName: MyRDS
      AllocatedStorage: 10
      DBInstanceClass: db.t2.micro
      StorageType: gp2
      Engine: postgres
      EngineVersion: 11.4
      MasterUsername: DBUser
      MasterUserPassword: DBPassword
      PubliclyAccessible: False
      VPCSecurityGroups:
        - !GetAtt VPC.DefaultSecurityGroup
      DBSubnetGroupName: !Ref DBSubnetGroup



  DBReplicaInstance: 
    Type: AWS::RDS::DBInstance
    Properties: 
      DBInstanceIdentifier: DemoReplica
      AllocatedStorage: 10
      DBInstanceClass: db.t2.micro
      SourceDBInstanceIdentifier: !Ref DBMasterInstance
      SourceRegion: ap-northeast-3

Пара проблем с вашим шаблоном CFN:

  1. Подсети RDS имеют маршрут по умолчанию, указывающий на веб-экземпляр - я сомневаюсь, что вы захотите это сделать. Обычно у вас будет только 2 или 3 общедоступных подсети с использованием IGW для 0.0.0.0/0 и 2 или 3 частных подсети с использованием NAT GW для 0.0.0.0/0. Все ваши экземпляры и базы данных должны находиться в частных подсетях, а ALB - в общедоступных подсетях.

  2. Когда вы создаете веб-экземпляр, как говорится в шаблоне нет запущенного веб-сервера, следовательно, порт 80 ничего не прослушивает, и, в свою очередь, ALB считает экземпляр неисправным. Вот почему вы получаете сообщение «502 Bad gateway» или что-то в этом роде.

    В идеале вам следует установить и запустить веб-сервер через экземпляр UserData при загрузке. Таким образом, ALB увидит, что он работает, и начнет отправлять ему трафик.

  3. На самом деле у вас нет возможности подключиться к веб-экземпляру по SSH, поскольку он находится в частной подсети. Обычно вы также создаете Перейти хост в публичной подсети, к которой вы можете подключиться по SSH и / или VPN, или настроить Системный менеджер в веб-экземпляре, чтобы вы могли открыть SSM сессия к нему без использования узла перехода. Для этого вам понадобится роль EC2.

Это должно дать вам несколько советов для начала. Надеюсь, поможет :)