Как мне получить имя хоста экземпляра RDS в переменную окружения в EC2? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть шаблон CloudFormation, который создает RDS и EC2 в одном стеке.Моя проблема в том, как мне получить имя хоста RDS в одной из переменных среды внутри моего EC2, без необходимости устанавливать AWS cli и добавлять учетные данные?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Идея та же, что и у [tyron], но вы можете на самом деле сократить код в YAML, поскольку! Sub может разрешать то же самое, что и GetAtt, как выражение:

Resources:
  Rds:
    Type: AWS::RDS::DBInstance
    Properties:
      ...

  Ec2:
    Type: AWS::EC2::Instance
    Properties:
      ...
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash

            echo "DB_CONNECTION=${Rds.Endpoint.Address}" >> /etc/profile 

The ${Rds.Endpoint.Address} будет разрешен! Sub - перед запуском экземпляра - мы не интерпретируем его оболочкой bash, даже если синтаксис выглядит очень похоже.

Фактический код оболочки вUserData зависит от того, кто (какой пользователь / процесс) намерен использовать переменную.С кодом, который я дал, он должен быть установлен для всей системы, поэтому независимо от того, кто входит в систему, он должен иметь это свойство.Конечно, если процесс уже запущен и уже прочитал свойства env, он не увидит новое значение - только новые экземпляры оболочки запускаются после выполнения пользовательских данных.

Лучший ответ, связанный с ответом) для необходимого шелл-кода, например: https://stackoverflow.com/a/1641531/4966203

0 голосов
/ 25 октября 2018

Я предполагаю, что "Имя хоста RDS" является вашей конечной точкой RDS?

Вы можете добавить свои пользовательские данные EC2, как показано ниже.Я не очень привык к Linux, поэтому не уверен, что это будет способ установить переменную среды, но вы поняли.

Resources:
  Rds:
    Type: 'AWS::RDS::DBInstance'
    Properties:
      ...

  Ec2:
    Type: 'AWS::EC2::Instance'
    Properties:
      ...
      UserData: !Base64 
        'Fn::Sub': 
          - |-
            <script>
            export DB_CONNECTION="${RdsEndpoint}"
            </script>
          - { RdsEndpoint: !GetAtt Rds.Endpoint.Address }

Обновление

В этом конкретном случае вам необходимо использовать длинный синтаксис Fn::Sub, так как для вашей ссылки необходимо использовать Fn::GetAtt.Если требуемая информация была получена простым Fn::Ref, вы можете использовать короткий синтаксис:

      UserData: !Base64 
        'Fn::Sub': 
          <script>
          export DB_CONNECTION="${Rds}" # <-- this will get the DBInstanceIdentifier
          </script>

Обновление 2 : как указаноДжозефом, вы все равно можете использовать короткий синтаксис, независимо от того, является ли источник! Ref или! GetAtt.Так что это действительно:

  UserData: !Base64 
    'Fn::Sub': |-
      <script>
      export DB_CONNECTION="${Rds.Endpoint.Address}"
      </script>
...