AWS上的Elastic Beanstalk实例无法使用RDS环境变量吗?

时间:2017-11-28 17:24:54

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

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

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

  

RDS_HOSTNAME = foo.com

     

RDS_USERNAME = FOO

     

RDS_PASS =酒吧

服务器配置

需要这些
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}'。       at 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)       at io.dropwizard.configuration.SubstosingSourceProvider.open(SubstitutionSourceProvider.java:39)       at io.dropwizard.configuration.BaseConfigurationFactory.build(BaseConfigurationFactory.java:83)       at io.dropwizard.cli.ConfiguredCommand.parseConfiguration(ConfiguredCommand.java:124)       at 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-user恢复这些值的任何想法吗?

我试过了:

  • 重新启动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

2 个答案:

答案 0 :(得分:1)

我会运行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

答案 1 :(得分:0)

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