Heroku帮助部署使用Mysql数据库的Rails应用程序

17

我正在尝试部署一个使用Mysql的Rails应用程序。

我已经:

  1. 创建了一个Heroku应用程序,并将我的应用程序推送到了Heroku。

  2. 我添加了Amazon RDS,创建了一个Amazon RDS数据库实例。 我的Heroku Amazon RDS数据库URL是:mysql://mysusername:mypassword@rdshostname.amazonaws.com/mydatabasename

我的Amazon RDS DB安全组设置为默认。

  1. 我尝试推送本地数据库,但出现以下错误 Heroku帮助Amazon RDS Rails推送数据库错误

我做错了什么?

我的Rdshostname是什么?它是亚马逊的终端节点吗?

2个回答

36
我首先想说,我理解您的痛苦。最近我也是Rails 3 + Heroku + Amazon RDS的新手。但是,今晚我解决了这个问题,并立即上Stack Overflow告诉其他遇到问题的人。我稍后会在博客中写一篇文章。
您可能会跳过其中的一些内容,但我会在我的回答中尽可能详细,包括您需要采取的步骤以及我遇到的一些陷阱和问题。
陷阱#1:heroku无法安装mysql2 gem,出现以下错误:
       You have added to the Gemfile:
      * mysql2
      FAILED: http://devcenter.heroku.com/articles/bundler
!     Heroku push rejected, failed to install gems via Bundler
解决方案:对于任何要求较高的工作,我几乎总是使用PostgreSQL,而对于沙盒和实验,我只需使用SQLite3快速进出。真正的问题在于我没有在本地机器上运行MySQL。当我回来尝试在本地运行bundle install时,自然会因为找不到mysql库而失败。我相信有一种方法可以解决这个问题,但我选择了安装本地mysql。之后,我能够轻松地运行bundle install。此外,git push heroku master也没有失败地将应用程序推送到Heroku。
   Installing activerecord (3.0.6) 
   Installing activeresource (3.0.6) 
   >>>>Installing mysql2 (0.3.2) with native extensions<<<< 
   Using bundler (1.0.7) 
   Installing thor (0.14.6) 
   Installing railties (3.0.6) 
   Installing rails (3.0.6) 
   Installing sqlite3 (1.3.3) with native extensions 
   Your bundle is complete! It was installed into ./.bundle/gems/
   Compiled slug size is 3.9MB
   -----> Launching... done
   http://myapp.heroku.com deployed to Heroku

注意事项 #2:我安装了mysql2宝石库,但我的应用程序仍然无法正常运行。通过执行heroku logs 命令之后,发现以下错误信息:

RuntimeError (!!! Missing the mysql2 gem. Add it to your Gemfile: gem 'mysql2'):

什么?我刚刚把它添加到我的Gemfile中,提交并成功推送了!我真的认为有人在对我开恶作剧。进一步研究和调试发现,heroku rake db:migrate返回:

WARNING: This version of mysql2 (0.3.2) doesn't ship with the ActiveRecord adapter bundled anymore as it's now part of Rails 3.1
WARNING: Please use the 0.2.x releases if you plan on using it in Rails <= 3.0.x

解决方案: 我使用gem uninstall mysql2卸载了mysql2宝石,并修改了gemfile中的一行,使之变为:

gem 'mysql2', '< 0.3'

这安装了mysql2 gem的0.2.7版本,也成功地在Heroku上安装了。
注意事项#3:在安装了正确版本的mysql2 gem之后,运行heroku rake db:migrate仍然返回相同的错误:
rake aborted!
!!! Missing the mysql2 gem. Add it to your Gemfile: gem 'mysql2'

好的,我做了更多的研究并找到了这个帖子,它基本上告诉我适配器正在尝试使用“mysql”适配器而不是“mysql2”适配器。

解决方案:解决此问题的方法是在heroku config中手动设置DATABASE_URL以使用mysql2://,方法如下:

heroku config:add DATABASE_URL=mysql2://user:password@dbInstanceName.hostname.us-east-1.amazonaws.com/databaseName

您可以在AWS配置面板中,通过点击您正在使用的数据库找到此URL中的"dbInstanceName.hostname.us-east-1.amazonaws.com"部分。
这必须使用命令行工具完成,并且不能使用Web控制面板上的RDS插件GUI添加,因为Heroku不会将其作为有效的数据库URL接受。
问题#4:安全配置不正确将不返回有用的错误信息。
解决方案:确保已将安全组添加到您的RDS配置中,以允许Heroku访问您的RDS实例,并将该安全组添加到您的实例中。如果需要CLI帮助,请查看 Heroku上的RDS文档或登录到您的AWS控制台并执行以下操作:
1.单击顶部的RDS选项卡。
2.单击左侧列中的DB安全组。
3.单击“创建DB安全组”。
4.输入名称和描述(例如:名称:Heroku,描述:允许Heroku访问!)。
5.在下面的面板中,选择新组,通过从下拉列表中选择“EC2安全组”来创建新授权。
6.对于安全组,请输入:“default”,对于AWS账户ID,请输入:“098166147350”(这很重要;此帐户号属于Heroku,必须将其添加到默认安全组中才能正常工作)。
7.单击“添加”。
8.重要! 修改现有数据库并将新的安全组添加到其中。
因此,如果您已经:
1.安装了正确版本的mysql2 gem(<0.3)
2.通过正确设置DATABASE_URL来设置heroku配置以使用mysql2适配器。
3.确保Heroku可以访问您的RDS,方法是在AWS RDS上创建相应的安全组,并将该安全组添加到您的数据库中,
那么您现在就可以在Heroku上使用RDS与Rails 3应用程序了。 :)

我遇到的另一个问题是,我在us-west地区(俄勒冈州)设置了我的第一个RDS实例,但这些说明似乎与AWS管理控制台中的界面不符。因此,我销毁了该实例,并在us-east地区(弗吉尼亚北部)设置了一个新的RDS实例,突然间AWS管理控制台界面变得清晰明了。 - Luke Griffiths
1
嘿,我只是想指出Heroku不再建议使用Heroku AWS帐户ID来授予访问权限:https://devcenter.heroku.com/changelog-items/353 - friism

4
  1. 将你的应用程序推送到Heroku(不要忘记包括gem taps)
  2. 添加Amazon RDS插件
  3. 在Amazon RDS中创建一个数据库实例
  4. 进入安全组并根据Heroku帮助Amazon RDS Rails推送数据库错误中的答案添加以下内容
  5. 你的Endpoint URL是你的rdshostname,不包括.amazonaws.com
  6. 登录Heroku并进入Amazon RDS插件,添加mysql://mysusername:mypassword@rdshostname.amazonaws.com/databasename

7
重要的是,如果您使用mysql2 gem作为适配器,请将连接的URL方案更改为mysql2://(请参见第6步)。 - William Denniss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接