繁体   English   中英

Rails 6 无法连接到 AWS Elastic Beanstalk 预置的 RDS。 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 应用程序启动到 Elastic Beanstalk。 对于上下文,我正在遵循这些说明

将 RDS 添加到 Ruby 应用程序

将 RDS 添加到 Beanstalk

我已按照这些说明进行操作,但仍然无法连接到我提供的 rds 数据库。 我不断收到以下错误:

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

每当我尝试运行RAILS_ENV=production rails db:migrate或任何其他 rake 任务时,我都会不断收到该错误。

在我的 AWS 控制台上,在ConfigurationSoftware 下,我有以下环境变量:

在此处输入图像描述

同样在我的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'] %>

我已按照文档中的说明映射了我的值,并确定它们是正确的。

最后,我进入了我的 beanstalk 配置的 ec2 实例并执行了以下命令:

psql -U username -p 5432 -h examplehost.rds.amazonaws.com -d ebdb

提供密码并能够连接。 我真的束手无策,我花了太多时间试图诊断这一点,而且我的想法已经不多了。 我不知道下一步该去哪里寻找有关如何解决此问题的想法。 我已经阅读了太多堆栈溢出问题和博客,以至于我头晕目眩。 如果有人对如何解决这个问题有任何想法,我将不胜感激。

---更新--- 我在弹性 beantalk 控制台上创建了一个新的环境变量。

ENV['DATABASE_URL'] = postgres://YourUserName:YourPassword@YourHostname:5432/YourDatabaseName

我进行了必要的配置,上传了我的 .zip 文件,但与数据库的连接失败。

- - 更新 - - -

printenv不显示 beanstalk 提供的变量,但是此命令执行sudo /opt/elasticbeanstalk/bin/get-config environment

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

正如 AWS 文档所指出的(强调我的):

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

和:

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

在我看来,即使对于测试或开发,始终建议配置一个小型数据库实例并让您的应用程序能够定义最合适的连接数据库的机制。

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

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

例如,您可以尝试将数据库连接配置存储在 S3 存储桶中,正如AWS 文档中所建议的那样。 这个想法基本上是创建一些具有必要连接信息的配置文件,将其存储在 S3 中,并在您的应用程序中读取该配置,即处理该文件,以初始化您的数据库。

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

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

在 Ruby 的情况下,您以正确的方式访问这些变量,但是由于任何原因,您的程序无法访问该信息。

这可能也解释了为什么如果您的变量但get-config脚本打印,则printenv不打印任何内容。

但是也许您可以利用get-config为您提供正确信息的事实,并且通过为每个RDS*密钥执行get-config脚本在您的ENV定义此变量,也许在您的environment.rb - 请意识到我在学生时代用 Ruby 编程,但从那以后很长一段时间,在您认为合适的文件中执行任务 - 或使用.ebextensions和自定义配置文件。 您可以在此处找到几个示例。

例如,请考虑以下内容(复制和粘贴, 对此示例配置稍作修改):

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

类似的方法可能是在此 stackoverrun question 中公开的方法,但仅限于 Beanstalk 将用于封装您的应用程序的容器。 AFAIK,容器应该接收作为env变量不同RDS*对应于数据库配置的。

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

我用 mysql 服务器找到了这个问题的答案,它可能仍然可以帮助你。 基本上,即使我按照您的所有步骤进行操作,也可以使用sudo /opt/elasticbeanstalk/bin/get-config environment查看我的 envar,并且可以使用mysql命令直接连接到我的数据库,但我仍然收到以下错误: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) (Mysql2::Error::ConnectionError)

解决方案原来是 Elastic Beanstalk 没有在eb ssh实例访问中将我的 envars 连接到我的bundle exec rails console命令。 我通过在我从eb ssh实例访问中运行的任何 rails 命令显式地添加所有必需的 envar 来解决该问题。 例如,为了运行rails console ,我必须运行以下命令:

RAILS_MASTER_KEY=xxxxxxx RAILS_ENV=production RDS_HOSTNAME=xxxxxxx RDS_PASSWORD=xxxxxxx RDS_USERNAME=xxxxxxx RDS_DB_NAME=xxxxxxx AWS_REGION=xxxxxxx AWS_BUCKET=xxxxxxx bundle exec rails c

将上面的xxxxxxx替换为 EB > 配置 > 软件选项卡中相应变量的值,您应该能够连接到远程数据库并运行迁移、rake 任务和其他依赖于数据库的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM