在两个不在一个实例上工作的EC2实例上使用MySQL数据库

时间:2013-04-23 15:02:38

标签: mysql ruby-on-rails ruby-on-rails-3 amazon-ec2 amazon

我正在尝试设置两个Rails应用程序。我希望他们俩都使用一个MySQL数据库。我的设置是这样的:

使用Elastic Beanstalk我已经设置了两个具有两个不同环境的Rails应用程序。我用MySQL数据库设置的应用程序之一。所以现在我有两个EC2实例 - 一个用于每个rails应用程序和一个RDS MySQL实例。

我在两个EC2实例中设置了安全组,以便能够通过port 3306连接到MYSQL。

我已将数据库安全组设置为授权两个EC2实例,并且还使用第二个EC2实例的私有IP设置CIDR / IP(配置Beanstallk应用程序时没有设置MySQL数据库的那个)

在两个Rails应用程序中,我设置了database.yml,如:

production:
  adapter: mysql2
  encoding: utf8
  database: <%= ENV['RDS_DB_NAME'] %>
  username: <%= ENV['RDS_USERNAME'] %>
  password: <%= ENV['RDS_PASSWORD'] %>
  host: <%= ENV['RDS_HOSTNAME'] %>
  port: <%= ENV['RDS_PORT'] %>

我在第二个实例(没有MySQL DB的实例)上为第一个EC2实例的ENV值分配了生产的ENV值。

我在这里缺少什么?

我还将我的计算机IP地址添加到DB Securty Group,并且我能够使用我用作ENV变量的凭据连接到MySQL DB。

3 个答案:

答案 0 :(得分:2)

你可能会错过这个:

socket: /var/lib/mysql/mysql.sock

答案 1 :(得分:0)

问题解决了 - 我在database.yml文件中设置了DB凭据,而不是ENV变量。环境变量被弹性beanstalk上的git aws.push每次推送覆盖。

答案 2 :(得分:0)

在我的情况下,这是因为我使用了错误的ENV变量名。 您可以通过使用eb sshprintenv | grep RDS连接到您的实例来仔细检查是否已正确设置所有内容,这应该会为您提供类似的内容:

RDS_HOSTNAME=yourhostname.amazonaws.com
RDS_DB_NAME=ebdb
RDS_PASSWORD=yourpassword
RDS_USERNAME=yourusername
RDS_PORT=3306

确保这些内容反映在您的config / database.yml文件中 - 使用<%= ENV['varname'] %>或通过硬编码。显然,前一种选择是可取的。 :)