! GetAtt InternalLB.DNSName - PullRequest
       42

! GetAtt InternalLB.DNSName

0 голосов
/ 08 июля 2020

Я пытаюсь получить dns внутреннего балансировщика нагрузки classi c и передать его в конфигурации запуска экземпляра ec2 как пользовательские данные. Создание базы данных в экземпляре ec2 и в файле конфигурации пытается получить DNS внутреннего балансировщика нагрузки classi c, но я не могу его получить. !GetAtt InternalLB.DNSName Я использовал это в пользовательских данных, но db не подключен, но когда я вручную передаю dns, он работает. Мне нужно получить dns на нем с помощью этого скрипта userdata.

  ec2instance:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      # AvailabilityZone: us-east-2a
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
           cd /var/www
           mkdir inc
           cd inc
           sudo echo "<?php

           define('DB_SERVER', '!GetAtt InternalLB.DNSName'); 
           define('DB_USERNAME', 'db');
           define('DB_PASSWORD', 'db');
           define('DB_DATABASE', 'db');

           ?>" > dbinfo.inc
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            DeleteOnTermination: "true"
            VolumeSize: "8"
            VolumeType: gp2
      ImageId: ami-0bdcc6c05dec346bf
      InstanceType: t2.micro
      KeyName: wahaj(webserver)
      SecurityGroups:
        - Ref: wahajwebserver
  myASG:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      AvailabilityZones:
        - "us-east-2a"
        - "us-east-2b"
      AutoScalingGroupName: myASG
      LoadBalancerNames:
        - Fn::ImportValue: !Sub "${elb}-MyLoadBalancer"
      MinSize: "2"
      MaxSize: "2"
      DesiredCapacity: "2"
      HealthCheckGracePeriod: 300
      LaunchConfigurationName:
        Ref: ec2instance
      VPCZoneIdentifier:
        - Fn::ImportValue: !Sub "${SourceStackName}-SubnetC"
        - Fn::ImportValue: !Sub "${SourceStackName}-SubnetD"
  internalelbsg:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: internal-elb
      VpcId:
        Fn::ImportValue:
          Fn::Sub: "${SourceStackName}-VpcID"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          SourceSecurityGroupId: !GetAtt wahajwebserver.GroupId
          Description: For traffic from Internet
      GroupDescription: Security Group for demo server
  InternalLB:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    Properties:
      Scheme: internal
      Listeners:
        - LoadBalancerPort: "80"
          InstancePort: "80"
          Protocol: HTTP
        - LoadBalancerPort: "3306"
          InstancePort: "3306"
          Protocol: TCP
      SecurityGroups:
        - !Ref internalelbsg
      LoadBalancerName: internalelbsg
      Subnets:
        - Fn::ImportValue: !Sub "${SourceStackName}-SubnetC"
        - Fn::ImportValue: !Sub "${SourceStackName}-SubnetD"
      HealthCheck:
        Target: HTTP:80/index.html
        HealthyThreshold: "3"
        UnhealthyThreshold: "5"
        Interval: "30"
        Timeout: "5"

Основная проблема заключается в define('DB_SERVER', '!GetAtt InternalLB.DNSName'); этой строке, я неправильно загружаю DNS. Пожалуйста, помогите

1 Ответ

1 голос
/ 09 июля 2020

Чтобы использовать GetAtt внутри Sub, вы должны использовать синтаксис VarName: VarValue, как описано на странице документации Fn :: Sub . Кроме того, вы должны заключить VarName в ${}, т.е. ${VarName}.

Я считаю, что этот синтаксис должен работать:

      UserData:
        Fn::Base64: !Sub
          - |
            #!/bin/bash
            cd /var/www
            mkdir inc
            cd inc
            sudo echo "<?php

            define('DB_SERVER', '${InternalLBDNSName}'); 
            define('DB_USERNAME', 'db');
            define('DB_PASSWORD', 'db');
            define('DB_DATABASE', 'db');

            ?>" > dbinfo.inc
          - InternalLBDNSName: !GetAtt InternalLB.DNSName
...