AWS Elastic Beanstalk RDS_DB_NAME 环境变量被忽略 (Rails 5)

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk RDS_DB_NAME 环境变量被忽略 (Rails 5)【英文标题】:AWS Elastic Beanstalk RDS_DB_NAME environment variable is ignored (Rails 5) 【发布时间】:2019-03-03 02:46:33 【问题描述】:

我一直在使用 Elastic Beanstalk 在 RDS 中创建的 ebdb 数据库。看来 Elastic Beanstalk 控制台中的 RDS_DB_NAME 环境变量可以留空而不影响应用程序的运行:

我重新启动了应用服务器(使用 EB 控制台),但没有任何效果。我注意到当我进入RDS时,数据库名称仍然奇怪地列为ebdb

任何人都可以确认这种行为,并且 - 如果我是正确的 - 我如何切换到 RDS 上的不同数据库? (在我的情况下,我正在测试备份和恢复,并希望我的 Rails 5.2 应用程序暂时指向恢复的数据库。)

FWIW,我有标准的 Rails config/database.yml:

production:
  <<: *default
  database: <%= ENV['RDS_DB_NAME'] %>
  username: <%= ENV['RDS_USERNAME'] %>
  password: <%= ENV['RDS_PASSWORD'] %>
  host: <%= ENV['RDS_HOSTNAME'] %>
  port: <%= ENV['RDS_PORT'] %>

【问题讨论】:

如果我假设 AWS 没有以某种方式缓存环境数据,那么我唯一想到的是您的应用程序没有在生产环境中运行? 谢谢,@MladenIlić。好主意,但我已检查 RACK_ENV 是否设置为“生产”。也许那个变量也没有任何作用! 尝试将RAILS_ENV 设置为production 很遗憾,无法设置数据库的名称。正如 Nezir 下面建议的那样,通过 EB 创建数据库仅用于测试目的。出于生产目的,请直接使用 AWS RDS 创建数据库。然后将 AWS RDS 的元数据作为环境变量存储在 Elastic Beanstalk 中。 使用双引号,例如: 【参考方案1】:

根据用户体验,他在blog 中建议:

不要将 RDS 实例与 Beanstalk 环境关联 Elastic Beanstalk 允许您在创建新环境时关联 RDS 实例。但是,我建议您不要在生产环境中这样做。

首先,这里有一些这样做的好处:

Elastic Beanstalk 会自动创建 RDS 实例以及正确配置的安全组。 环境变量被注入到您的所有 EC2 实例中(如 RDS_HOSTNAME、RDS_USERNAME……)。 但是,对我来说,有一个很大的缺点是它无法在生产中使用:现在,RDS 与您的环境相关联。这意味着,如果出于某种原因您需要重建环境(例如更新 Elastic Beanstalk AMI),您将陷入困境,因为 Elastic Beanstalk 将删除任何关联的资源(例如您的 RDS 实例)。然后,您需要创建 RDS 实例的快照,并从中重新创建一个新实例。这将导致一些停机时间。

在我看来,最好的方法是单独创建 RDS 实例,并手动将 RDS 环境变量注入到新创建的环境中,例如使用 Elastic Beanstalk GUI 工具。这更灵活!

请转到博客链接并在blog post下方的评论中阅读有关体验的更多信息。

【讨论】:

谢谢,@Nezir。是的,我昨天也阅读了该博客,并得出结论认为,对于 5 年以上(?)岁的产品,EB 并不像我希望的那样强大。 您可以通过转到RDS仪表板中的设置并保护它不被删除来防止删除RDS数据库。我认为没有理由手动创建它

以上是关于AWS Elastic Beanstalk RDS_DB_NAME 环境变量被忽略 (Rails 5)的主要内容,如果未能解决你的问题,请参考以下文章