【问题标题】:How do I get the hostname of RDS instance into an Environment variable in EC2?如何将 RDS 实例的主机名放入 EC2 中的环境变量中?
【发布时间】:2018-10-28 01:45:44
【问题描述】:

我有一个 CloudFormation 模板,可以在同一个堆栈下创建 RDS 和 EC2。我的问题是,如何将 RDS 主机名放入我的 EC2 中的环境变量之一,而无需安装 AWS cli 和添加凭据?

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-cloudformation rds


    【解决方案1】:

    我假设“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:正如 Josef 所指出的,您仍然可以使用短语法,无论源是 !Ref 还是 !GetAtt。所以这是有效的:

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

    【讨论】:

      【解决方案2】:

      这个想法与 [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 
      

      ${Rds.Endpoint.Address} 将由 !Sub 解析 - 在启动实例之前 - 我们不会由 bash shell 解释它,即使语法看起来非常相似。

      UserData 中的实际 shell 代码取决于谁(哪个用户/进程)打算使用该变量。使用我给出的代码,它应该在系统范围内设置,所以无论谁登录,它都应该具有该属性。当然,如果进程已经在运行并且已经读取了 env 属性,它就不会看到新的值——只有在用户数据被执行后才会启动新的 shell 实例。

      您需要的 shell 代码的最佳检查相关答案,例如:https://stackoverflow.com/a/1641531/4966203

      【讨论】:

        猜你喜欢
        • 2022-10-04
        • 2021-04-26
        • 2021-02-02
        • 2020-11-04
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多