Ruby on rails Rails 6无法连接到AWS Elastic Beanstalk配置的RDS。Unix域套接字“/var/run/postgresql/.s.PGSQL.5432“;

Ruby on rails Rails 6无法连接到AWS Elastic Beanstalk配置的RDS。Unix域套接字“/var/run/postgresql/.s.PGSQL.5432“;,ruby-on-rails,amazon-web-services,amazon-elastic-beanstalk,amazon-rds,Ruby On Rails,Amazon Web Services,Amazon Elastic Beanstalk,Amazon Rds,我很难在Elastic Beanstalk上启动Rails 6示例应用程序。出于上下文考虑,我遵循这些说明 我已经按照这些说明进行了测试,但仍然无法连接到已设置的rds数据库。我一直收到以下错误: PG::ConnectionBad:无法连接到服务器:没有这样的文件或目录 服务器是否在本地运行并接受 Unix域套接字上的连接“/var/run/postgresql/.s.PGSQL.5432” 每当我试图运行RAILS\u ENV=production-RAILS-db:migrate或任何

我很难在Elastic Beanstalk上启动Rails 6示例应用程序。出于上下文考虑,我遵循这些说明

我已经按照这些说明进行了测试,但仍然无法连接到已设置的rds数据库。我一直收到以下错误:

PG::ConnectionBad:无法连接到服务器:没有这样的文件或目录 服务器是否在本地运行并接受 Unix域套接字上的连接“/var/run/postgresql/.s.PGSQL.5432”

每当我试图运行
RAILS\u 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'] %>
提供了密码,我可以连接。我真的是束手无策,我花了太多的时间来诊断这个问题,现在已经没有办法了。我也不知道下一步该去哪里寻找解决这个问题的方法。我读了太多关于堆栈溢出的问题和博客,我的脑袋都快晕过去了。如果有人对如何解决这个问题有任何想法,我将不胜感激

---更新---- 我在elastic beanstalk控制台上创建了一个新的环境变量

ENV['DATABASE_URL'] = postgres://YourUserName:YourPassword@YourHostname:5432/YourDatabaseName
我进行了必要的配置,上载了.zip文件,但与数据库的连接失败

----更新-----


printenv
不显示beanstalk提供的变量,但是这个命令确实显示了
sudo/opt/elasticbeanstalk/bin/get-config-environment

我的第一个建议是,在我看来,自己创建AmazonRDS是一个更好的选择,而不是绑定到beanstalk

正如美国焊接学会(AWS)所指出的(我的重点):

AWS Elastic Beanstalk支持在您的Elastic Beanstalk环境中运行Amazon关系数据库服务(Amazon RDS)实例。要了解这一点,请参阅向Elastic Beanstalk环境添加数据库这对于开发和测试环境非常有效。但是,它并不适合于生产环境,因为它将数据库实例的生命周期与应用程序环境的生命周期联系起来。

以及:

要将数据库实例与环境分离,可以在Amazon RDS中运行数据库实例,并将应用程序配置为在启动时连接到它。这使您能够将多个环境连接到数据库,在不影响数据库的情况下终止环境,并使用蓝绿色部署执行无缝更新

在我看来,即使对于测试或开发,配置一个小的数据库实例并让应用程序能够定义连接到数据库的最合适的机制也是明智的

唯一的缺点是,您可能需要配置,尽管这实际上不应该是一个问题,而且在某些情况下,它是值得的

如果出于任何原因,您需要使用Beanstalk配置的RDS数据库,可能您有一些解决问题的方法(这应该是一个解决方法,因为您的配置看起来很好-请仅验证数据库配置是否为正确的Beanstalk环境定义)

例如,您可以尝试将数据库连接配置存储在S3存储桶中,如中所建议的。其基本思想是使用必要的连接信息创建一些配置文件,将其存储在S3中,并在应用程序中读取该配置,即处理该文件,以便初始化数据库

但也许你可以尝试另一种方法

请考虑这一点,以及Jon McAuliffe和其他人的答案。如前所述,Beanstalk将为您的应用程序提供环境变量,但这些变量可能不会作为shell变量公开,它们将以不同的方式公开给您的应用程序,具体取决于应用程序需要在哪个运行时执行

对于Ruby,您正在访问中的这些变量,但由于任何原因,您的程序都无法访问这些信息

这可能也解释了为什么
printenv
不打印任何变量,但脚本打印

但是,也许您可以利用
get config
为您提供了正确的信息这一事实,或者在您的
ENV
中通过为每个
RDS*
键执行
get config
脚本来定义此变量,可能是在您的
环境中。rb
-请,请注意,我在Ruby编程时,我是一个学生,但有很长一段时间以来,在您认为适当的文件或使用和自定义配置文件中的任务。你可以找到几个例子

例如,考虑下面的(复制和粘贴,稍加修改):

类似的方法也可以在中公开,但仅限于Beanstalk用于封装应用程序的容器。这样,容器应该作为
env
变量接收与数据库配置相对应的不同
RDS*
变量


Dan,请注意,我没有测试这些解决方案,它们只是想法:请小心,我不想对您的系统造成任何损坏。

您可以从应用程序中启动rails控制台吗
cd/var/app/current
然后启动控制台?rails服务器和rack env是否设置为生产模式?感谢大家的响应。是的,这两个变量都设置为production,我可以访问rails控制台。但是,如果我试图进行任何类型的查询或活动记录语句,我会收到
ENV['DATABASE_URL'] = postgres://YourUserName:YourPassword@YourHostname:5432/YourDatabaseName
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