【问题标题】:Connecting Heroku to RDS using MySql2使用 MySql2 将 Heroku 连接到 RDS
【发布时间】:2014-02-21 00:33:33
【问题描述】:

我要做的就是在 Heroku 上部署我的 Rails 应用程序,并在 RDS 上使用一个数据库实例,这看起来应该很简单。

我在database.yml 中使用mysql2 适配器,并已推送到heroku 并根据this answer 添加了我的数据库实例。我基本上已经将它跟踪到了 T,并且我没有收到 missing gem 错误。但这就是heroku logs 透露的内容:

/app/vendor/bundle/ruby/1.9.1/bundler/gems/mysql2-e5992664a7bc/lib/mysql2/client.rb:56:in connect': Can't connect to MySQL server on 'nickcoxrails.cud3e2tma07q.us-east-1.rds.amazonaws.com' (110) (Mysql2::Error)

另外请注意,我的 RDS 实例位于 us-east,我听说这是一个问题 here

在我的 gemfile 中,我有:

gem 'mysql2', :git => 'git://github.com/brianmario/mysql2.git'

对于我的 mysql2 gem,因为这是我可以让它在本地工作的唯一方法(因为第一个答案使用

我确实为每个this answer 添加了安全组,并为每个this answer 添加了mysql2 数据库。我还在我的 heroku 帐户中添加了 RDS 插件。我运行了rake db:createrake db:schema:loadrake db:migrate 以及所有内容,但是由于我将本地数据库导出到了我的RDS 实例(我需要保持该数据完整),所以这些都没有任何新功能。而且我可以通过 Sequel Pro 连接到我的 RDS 实例,所以我知道这不是凭据问题。

这是我的第一个 Rails 应用程序部署,所以不要害怕回答你的问题,给我相当于“它是否已插入?” heroku/Rails/RDS/等的技术支持问题。

【问题讨论】:

  • 您可能想根据官方文档尝试使用RDS addon
  • 感谢您的建议。请注意,在我的问题中,我提到了该附加组件。当我heroku conifig:get DATABASE_URL 时,它会呼应我的 RDS 数据库,所以我认为设置正确。这是一个合理的假设吗?
  • 抱歉,在阅读问题时错过了这一点。如果 DATABASE_URL 设置了您的 RDS 实例,则表明它已正确设置。您在安装插件后是否运行了rds-authorize-db-security-group-ingress?错误消息表明这可能是问题所在。
  • 感谢您的坚持。我没有运行它(因为我无法理解 RDS CLI 工具的文档),但我确实通过 RDS ui 授权了我的 ip,看起来它做了同样的事情......? Here 的截图。做同样的事情吗?
  • 这取决于您的安全组是如何配置的。最好从帐户 098166147350(归 Heroku 所有)添加默认安全组

标签: mysql ruby-on-rails heroku amazon-rds


【解决方案1】:

Heroku 更改了其程序以允许 Heroku 服务器连接到 RDS 实例。这个问题的公认答案不再是应该如何做。

您必须授予 Heroku dynos 访问您的 RDS 实例的权限。推荐的方法是将 RDS 实例配置为仅接受 SSL 加密的连接,并将您的实例的安全组配置为允许来自所有 IP 的入口。

之前,Heroku 发布了其 AWS 账户 ID 和安全组名称,作为授予对 AWS RDS 实例的访问权限的一种方式。 不再推荐。

参考:https://devcenter.heroku.com/articles/amazon_rds

【讨论】:

    【解决方案2】:

    确保您已从 Heroku 拥有的 AWS 账户 098166147350 授权安全组 default。错误消息表明您的连接不被允许。

    【讨论】:

      【解决方案3】:

      我刚刚用 Heroku+AWS(MySQL 实例)取得了胜利。我不得不向 Heroku 提交支持票以解决此问题(操作员错误),我想发布此信息以帮助其他人。我一直碰到这个帖子。

      我在带有 Amazon MySQL RDS 的 Heroku 上使用 Rails(4)。是的,您需要配置 SSL(pem 文件和所有有趣的东西)。但是我无法让 Rails 连接起来,并且非常接近地跟踪所有的遍历。亚马逊数据库正在运行,我可以在 Heroku/Rails 之外连接没有问题(通过我的 IP)。

      问题出在安全组和 IP 访问中。通过我的支持票“[您的] RDS mysql DB ...您需要允许来自所有 IP 的入口”。这是 Heroku 提供的链接:https://devcenter.heroku.com/articles/amazon_rds#require-ssl Heroku 当前声明:

      “您必须授予 Heroku dynos 对您的 RDS 实例的访问权限。推荐的方法是将 RDS 实例配置为仅接受来自授权用户的 SSL 加密连接,并为您的实例配置安全组以允许从所有 IP。”

      一些搜索很快让我修改了我的 AWS 数据库实例的默认安全组并添加了 CIDR/IP 条目:

      0.0.0.0/0
      

      基本上允许任何/所有 IP。一旦授权所有连接。

      我仍在审查此设置并寻求朋友和社区的反馈。幸运的是,我仍在开发中,有一些时间来消化这个设置。

      希望这可以节省一些时间,这似乎是通过 Heroku Dynos 连接到 AWS DB 的当前方法。

      祝你好运,我会留意任何反馈。

      编辑:在设置上休眠后,我从默认值中删除了 0.0.0.0/0 并将其添加到一个隔离的安全组并测试 - 工作。我担心在非 SSL 数据库上使用 . 样式的 IP 访问应用默认安全组。那感觉不对。

      【讨论】:

        猜你喜欢
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-21
        • 2020-09-15
        相关资源
        最近更新 更多