我的第一个建议是,在我看来,自己创建 Amazon RDS 是一个更好的选择,而不是与 Beanstalk 绑定。
正如AWS文档 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.RDS.html表示(强调我的):
AWS Elastic Beanstalk 支持在 Elastic Beanstalk 环境中运行 Amazon Relational Database Service (Amazon RDS) 实例。要了解相关信息,请参阅将数据库添加到您的 Elastic Beanstalk 环境。这对于开发和测试环境非常有用。但是,它对于生产环境来说并不理想,因为它将数据库实例的生命周期与应用程序环境的生命周期联系在一起。
And:
要将数据库实例与环境分离,您可以在 Amazon RDS 中运行数据库实例并将应用程序配置为在启动时连接到它。这使您能够将多个环境连接到数据库、终止环境而不影响数据库,并通过蓝绿部署执行无缝更新。
在我看来,即使对于测试或开发,也始终建议配置一个小型数据库实例,并使您的应用程序能够定义最合适的机制来连接到数据库。
唯一的downside是你可能需要配置一个VPC https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/rds-external-defaultvpc.html,尽管它实际上不应该是一个问题,并且在任何情况下,它都是值得的。
如果出于任何原因您需要使用 Beanstalk 提供的 RDS 数据库,也许您有一些解决方法来解决您的问题(这应该是一个解决方法,因为您的配置看起来不错 - 请仅验证是否为正确的 Beanstalk 环境定义了数据库配置) 。
例如,您可以尝试的一件事是将数据库连接配置存储在 S3 存储桶中,如AWS 文档 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/rds-external-credentials.html。这个想法基本上是创建一些包含必要连接信息的配置文件,将其存储在 S3 中,并在应用程序中读取该配置,即处理该文件,以便初始化数据库。
但也许你可以尝试另一种方法。
请考虑这一点所以问题 https://stackoverflow.com/questions/24562714/elastic-beanstalk-custom-ami-cant-see-environment-variables,以及乔恩·麦考利夫和其他人的回答。如前所述,Beanstalk 将为您的应用程序提供环境变量,但这些变量可能不会作为 shell 变量公开,它们将以不同的方式公开给您的应用程序,具体取决于应用程序需要执行的运行时。
对于 Ruby,您可以在正确的方法 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-softwaresettings.html但是,出于某种原因,您的程序无法访问该信息。
这或许也可以解释为什么printenv
如果您的变量但不打印任何内容获取配置 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platforms-scripts.html脚本确实如此。
但也许你可以利用这样一个事实get-config
为您提供正确的信息,并且可以在您的ENV
通过执行get-config
每个的脚本RDS*
关键,也许在你的environment.rb
- 请注意,当我还是一名学生时,我用 Ruby 进行了编程,但从那以后已经很长一段时间了,请在您认为合适的文件中执行任务 - 或使用.ebextensions https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environment-configuration-methods-during.html和自定义配置文件。你可以找到几个例子here https://github.com/awsdocs/elastic-beanstalk-samples/blob/9720e38e9da155752dce132a31d8e13a27364b83/configuration-files/aws-provided/instance-configuration/timezone-linux.config.
例如,考虑以下内容(复制并粘贴,稍作修改这个示例配置 https://github.com/awsdocs/elastic-beanstalk-samples/blob/9720e38e9da155752dce132a31d8e13a27364b83/configuration-files/aws-provided/security-configuration/rds-ssl-java.config):
commands:
01_update_env:
command: "/tmp/update_environment_variables.sh"
files:
"/tmp/update_environment_variables.sh":
mode: "000755"
content : |
#!/bin/bash
RDS_HOSTNAME=$(/opt/elasticbeanstalk/bin/get-config environment -k RDS_HOSTNAME)
if [ -z "$RDS_HOSTNAME" ]; then
echo "Could not determine RDS hostname"
exit 1
fi
echo "RDS hostname $RDS_HOSTNAME..."
# Just export the variable at OS level, or make it visible to
# the rails env in some other way
export RDS_HOSTNAME=$RDS_HOSTNAME
# Process the rest of the variables...
# Probably we should create a list and iterate through it
类似的方法可能是在这个堆栈溢出问题 https://stackoverrun.com/es/q/8088203,但仅限于 Beanstalk 将用来封装您的应用程序的容器。 AFAIK,容器应接收为env
变量不同RDS*
与数据库配置相对应。
丹,请注意,我没有测试过这些解决方案,它们只是想法:请小心,我不想对您的系统造成任何损坏。