Rails 6无法连接到AWS弹性豆茎调配的RD。UNIX域套接字/var/run/postgresql/.s.PGSQL.5432"; [英] Rails 6 is unable to connect to AWS Elastic Beanstalk provisioned RDS. Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"
问题描述
我在尝试将示例rails 6应用程序启动到弹性豆茎时遇到了很大困难。对于上下文,我遵循以下说明
我已经按照TEE的说明进行了操作,但仍然无法连接到我提供的RDS数据库。我一直收到以下错误:pg::ConnectionBad:无法连接到服务器:没有这样的文件或目录 服务器是否在本地运行并接受 Unix域套接字";/var/run/postgresql/.s.PGSQL.5432";?上的连接
每当我尝试运行RAILS_ENV=production rails db:migrate
或任何其他rake任务时,都会不断收到该错误。
在我的AWS控制台配置和软件下,我有以下环境变量:
在我的database.yml
文件中,我的RDS配置变量也是这样列出的。
production:
adapter: postgresql
database: <%= ENV['RDS_DB_NAME'] %>
username: <%= ENV['RDS_USERNAME'] %>
password: <%= ENV['RDS_PASSWORD'] %>
host: <%= ENV['RDS_HOSTNAME'] %>
port: <%= ENV['RDS_PORT'] %>
我已按照文档中的说明映射了我的值,并且确信它们是正确的。
最后,我已经切换到我的豆茎配置的EC2实例,并执行了以下命令:
psql -U username -p 5432 -h examplehost.rds.amazonaws.com -d ebdb
提供了密码,我能够连接。我真的是束手无策,我花了太多时间试图诊断这个问题,现在已经没有主意了。我不知道下一步该在哪里寻找解决问题的方法。我读了这么多堆栈溢出问题和博客,都快晕过去了。如果有人对如何解决这个问题有什么想法,我将不胜感激。
-更新 我已经在弹性豆茎控制台上创建了一个新的环境变量。
ENV['DATABASE_URL'] = postgres://YourUserName:YourPassword@YourHostname:5432/YourDatabaseName
我进行了必要的配置,上载了我的.zip文件,但与数据库的连接失败。
-更新-
printenv
不显示由beanstalk提供的变量,但是此命令显示sudo /opt/elasticbeanstalk/bin/get-config environment
。
推荐答案
我的第一个建议是,在我看来,自己创建Amazon RDS是一个更好的选择,而不是绑定到豆茎。
如AWSdocumentation所示(强调我的):
AWS弹性豆茎支持在您的弹性豆茎环境中运行Amazon Relational Database Service(Amazon RDS)实例。要了解这一点,请参见将数据库添加到弹性豆茎环境。这非常适合开发和测试环境。但是,它不适合生产环境,因为它将数据库实例的生命周期绑定到应用程序环境的生命周期。
和:
要将您的数据库实例与您的环境分离,您可以在Amazon RDS中运行一个数据库实例,并将您的应用程序配置为在启动时连接到它。这使您能够将多个环境连接到一个数据库,在不影响数据库的情况下终止环境,并使用蓝绿色部署执行无缝更新。
在我看来,即使对于测试或开发,配置一个小型数据库实例并使您的应用程序能够定义最合适的连接到数据库的机制始终是明智的。
唯一的缺点是您可能需要配置VPC,尽管这实际上应该不是问题,而且在任何情况下都是值得的。
如果您出于任何原因需要使用Beanstalk预配的RDS数据库,可能您有一些解决方法(这应该是一种解决方法,因为您的配置看起来很好-请仅验证是否为正确的Beanstalk环境定义了数据库配置)。
例如,您可以尝试将数据库连接配置存储在S3存储桶中,正如AWS documentation中所建议的那样。其基本思想是创建具有必要连接信息的配置文件,将其存储在S3中,并在应用程序中读取该配置,即处理该文件,以便初始化数据库。但或许您可以尝试其他方法。
请考虑这个SO question,以及Jon McAuliffe和其他人的回答。如上所述,Beanstrik将为您的应用程序提供环境变量,但这些变量可能不会作为shell变量公开,它们将以不同的方式公开给您的应用程序,具体取决于应用程序需要在其上执行的运行时。
对于Ruby,您在correct way中访问这些变量,但是,由于任何原因,您的程序无法访问该信息。
这可能也解释了为什么除get-config脚本外,printenv
不打印任何变量。
get-config
为您提供正确信息这一事实,或者在您的ENV
中通过为每个RDS*
键执行get-config
脚本来定义此变量,可能是在您的environment.rb
中-请注意,我在学生时代用Ruby编程,但此后很长一段时间,在您认为合适的文件中完成任务-或者使用.ebextensions
和自定义配置您可以找到几个here示例。
例如,请考虑以下内容(复制并粘贴,稍作修改this example configuration):
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
类似的方法可能是this stackoverrun question中公开的方法,但仅限于Beanstrik将用来封装您的应用程序的容器。AFAIK,容器应将与数据库配置对应的不同RDS*
变量作为env
变量接收。
Dan,请注意,我没有测试过这些解决方案,它们只是一些想法:请小心使用,我不想对您的系统造成任何损坏。
这篇关于Rails 6无法连接到AWS弹性豆茎调配的RD。UNIX域套接字/var/run/postgresql/.s.PGSQL.5432";的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!