【问题标题】:RDS Environment variables not available to Elastic Beanstalk instance on AWS?RDS 环境变量对 AWS 上的 Elastic Beanstalk 实例不可用?
【发布时间】:2018-05-12 06:14:59
【问题描述】:

使用 RDS 创建 Java 8 Elastic Beanstalk 实例后,RDS 连接详细信息不作为环境变量可见(它们在其他正在运行的实例上可见)。

运行printenv 命令后,期望这些值可用,但它们不可用。

RDS_HOSTNAME=foo.com

RDS_USERNAME=foo

RDS_PASS=bar

这些是服务器配置所必需的

database:
    driverClass: com.mysql.jdbc.Driver
    user: ${RDS_USERNAME}
    password: ${RDS_PASSWORD}
    url: jdbc:mysql://${RDS_HOSTNAME}/${RDS_DB_NAME}

在应用程序触发期间它们不可用,日志显示 Java 异常,它无法找到环境变量。

io.dropwizard.configuration.UndefinedEnvironmentVariableException:未定义环境变量“RDS_USERNAME”;无法替换表达式“${RDS_USERNAME}”。 在 io.dropwizard.configuration.EnvironmentVariableLookup.lookup(EnvironmentVariableLookup.java:41) 在 org.apache.commons.lang3.text.StrSubstitutor.resolveVariable(StrSubstitutor.java:934) 在 org.apache.commons.lang3.text.StrSubstitutor.substitute(StrSubstitutor.java:855) 在 org.apache.commons.lang3.text.StrSubstitutor.substitute(StrSubstitutor.java:743) 在 org.apache.commons.lang3.text.StrSubstitutor.replace(StrSubstitutor.java:403) 在 io.dropwizard.configuration.SubstitutingSourceProvider.open(SubstitutingSourceProvider.java:39) 在 io.dropwizard.configuration.BaseConfigurationFactory.build(BaseConfigurationFactory.java:83) 在 io.dropwizard.cli.ConfiguredCommand.parseConfiguration(ConfiguredCommand.java:124) 在 io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:72) 在 io.dropwizard.cli.Cli.run(Cli.java:75) 在 io.dropwizard.Application.run(Application.java:93)

但是,如果我在 ec2 实例上运行以下命令

sudo /opt/elasticbeanstalk/bin/get-config environment

它以 JSON 格式打印出值:

{"CONFIG":"dev.yml","RDS_HOSTNAME":"foo.com","RDS_PASSWORD":"foo","M2":"/usr/local/apache-maven/bin","M2_HOME":"/usr/local/apache-maven","RDS_DB_NAME":"foo","JAVA_HOME":"/usr/lib/jvm/java","RDS_USERNAME":"foo","GRADLE_HOME":"/usr/local/gradle","RDS_PORT":"3306"}

任何想法如何为 ec2 用户恢复这些值?

我试过了:

  • 重启 EB 实例
  • 重建实例
  • cat 将值放入脚本中,在eb deploy 之后设置它们

任何想法,为什么它们在这个特定实例上不可见?

实例详情

  Environment details foo: foo-service
  Application name: foo-service
  Region: eu-west-2
  Platform: arn:aws:elasticbeanstalk:eu-west-2::platform/Java 8 running on 64bit Amazon Linux/2.6.0
  Tier: WebServer-Standard

【问题讨论】:

  • 你可以尝试在 /etc/environment 中初始化它们吗?当我需要确定环境变量存在时,我会确保将其添加到那里。所有用户 shell 都会以这种方式设置该变量。

标签: amazon-web-services amazon-ec2 environment-variables amazon-elastic-beanstalk


【解决方案1】:

检查一下,AWS 不会像我们预期的那样直接在您的操作系统中公开环境变量:

https://aws.amazon.com/premiumsupport/knowledge-center/elastic-beanstalk-env-variables-shell/

【讨论】:

    【解决方案2】:

    我会运行 EB 环境更新和/或替换实例。或者你可以移到"Storing the Connection String in Amazon S3"

    环境更新完成后,数据库实例的主机名 和其他连接信息可用于您的应用程序 通过以下环境属性:

    RDS_HOSTNAME – 数据库实例的主机名。 Amazon RDS 控制台标签 – 终端节点(这是主机名)

    RDS_PORT – 数据库实例接受连接的端口。默认值因数据库引擎而异。 Amazon RDS 控制台标签 – 端口

    RDS_DB_NAME – 数据库名称 ebdb。 Amazon RDS 控制台标签 – 数据库名称

    RDS_USERNAME – 您为数据库配置的用户名。 Amazon RDS 控制台标签 – 用户名

    RDS_PASSWORD – 您为数据库配置的密码。

    private static Connection getRemoteConnection() {
        if (System.getenv("RDS_HOSTNAME") != null) {
          try {
          Class.forName("org.postgresql.Driver");
          String dbName = System.getenv("RDS_DB_NAME");
          String userName = System.getenv("RDS_USERNAME");
          String password = System.getenv("RDS_PASSWORD");
          String hostname = System.getenv("RDS_HOSTNAME");
          String port = System.getenv("RDS_PORT");
          String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password;
          logger.trace("Getting remote connection with connection string from environment variables.");
          Connection con = DriverManager.getConnection(jdbcUrl);
          logger.info("Remote connection successful.");
          return con;
        }
        catch (ClassNotFoundException e) { logger.warn(e.toString());}
        catch (SQLException e) { logger.warn(e.toString());}
        }
        return null;
      }
    

    https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-rds.html#java-rds-javase

    【讨论】:

      【解决方案3】:

      你能尝试在 /etc/environment 中初始化它们吗?当我需要确保存在环境变量时,我会确保将其添加到那里。所有用户 shell 都会以这种方式设置该变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-08
        • 2015-08-05
        • 2016-11-01
        • 2016-12-10
        • 2017-06-16
        • 2015-09-15
        • 2017-05-23
        • 2015-06-08
        相关资源
        最近更新 更多