使用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恢复这些值的任何想法吗?
我试过了:
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
答案 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都将以这种方式设置该变量。