AWS Elastic Beanstalk:访问系统变量

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk:访问系统变量【英文标题】:AWS Elastic Beanstalk: access System variables 【发布时间】:2014-08-10 09:48:09 【问题描述】:

我有一个传统的 Tomcat Web 应用程序,它使用 JNDI 连接到 Postgres DB(读取 context.xml)。 在 AWS EBS 中,可以使用系统属性来读取特定的东西,比如 jdbc 连接参数,这将非常适合在不同的环境(开发、登台、生产)中轻松使用相同的包,而无需更改 context.xml 文件. 由于我使用的是JNDI DataSource,所以我访问的是原始数据源,然后更改url和密码,这样:

org.apache.tomcat.jdbc.pool.DataSource ds = (DataSource) new InitialContext().lookup("java:/comp/env/jdbc/myapp");
    String jdbcURL = System.getProperty("JDBC_CONNECTION_STRING"); 
    String username = System.getProperty("PARAM1"); 
    String password = System.getProperty("PARAM2"); 
    if (!StringUtils.isEmpty(jdbcURL))
        ds.setUrl(jdbcURL);
        ds.setUsername(username);
        ds.setPassword(password);
    

使用 Tomcat 数据源我可以访问连接参数的设置器和获取器。 在本地测试(在Tomcat的VM参数中添加系统参数,它工作得很好。 但是当我在AWS EBS中上传到我的测试环境时,这些参数一开始是空的(当应用程序加载时),但它们稍后可用:以这种方式在jsp页面中测试它们

The JDBC_CONNECTION_STRING environment property is:
<%= System.getProperty("JDBC_CONNECTION_STRING") %>
</p>

<p>
The PARAM1 environment property is:
<%= System.getProperty("PARAM1") %>
</p>
<p>]
The PARAM2 environment property is:
<%= System.getProperty("PARAM2") %>
</p>

并打印正确的值。 我唯一的猜测是系统属性是稍后加载的,而我在应用程序启动时调用的侦听器中设置了与数据库的连接(在 web.xml 中设置)。

知道为什么会失败吗?

谢谢,

罗希

编辑:我找到了问题,但没有找到解决方案: 问题是在lookup() 方法中加载DataSource 时,它​​也尝试建立连接!它不会成功,因为 context.xml 中的 url 是 localhost,而我在部署时没有数据库。

任何人都知道如何不立即连接,而是等到第一个 getConnection() 调用? 这是我的 context.xml

<Resource auth="Container" 
        driverClassName="org.postgresql.Driver" 
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
        maxActive="1000" maxIdle="1000" maxWait="2000"
        autoReconnect="true" 
        logAbandoned="true" 
        name="jdbc/townflix" 
        type="org.apache.tomcat.jdbc.pool.DataSource"  
        url="jdbc:postgresql://localhost:5432/mydb?prepareThreshold=3" 
        username="user" 
        password="pass"

/>

【问题讨论】:

【参考方案1】:

我不知道为什么会失败,但我可以告诉你我在个人项目中的做法。

我使用 .ebextensions/*.config 文件使用我的配置生成并覆盖 context.xml,从而在容器启动之前正确设置我的 DataSource。

见:https://github.com/Craftware/Kornell/blob/master/kornell-api/src/main/webapp/.ebextensions/tomcat7.config

【讨论】:

谢谢,但我在 EBS 中有 2 个不同的环境,生产环境和测试环境除了 JDBC 字符串之外完全一样......所以当我在两者之间移动时,我仍然需要手动更改环境。 我也有 2 个环境。如果您检查脚本,您会看到我下载并运行了一个脚本,该脚本替换了环境变量并将结果输出到 context.xml。 太棒了!对不起,我没有注意到。当我试图弄清楚在上面的场景中会发生什么时,我会使用它。谢谢! 没问题,我也在努力寻找更好的方法,如果我愿意,我会在这里发布。

以上是关于AWS Elastic Beanstalk:访问系统变量的主要内容,如果未能解决你的问题,请参考以下文章

无法访问此站点以获取 AWS Elastic Beanstalk 环境 URL

Node JS - Elastic Beanstalk AWS - 允许写访问

部署到 AWS Elastic Beanstalk 后如何访问 servlet?

AWS Elastic Beanstalk 上的 Docker - 无法从容器访问环境变量

在 Docker 中为 AWS Elastic Beanstalk 构建期间访问 .env 变量

AWS Elastic BeanStalk SignatureDoesNotMatch