2011-06-07 40 views
7

我似乎无法让Capistrano与AmazonRDS良好地配合。我已经找遍了各地的任何信息正确设置,但没有找到任何。现在,当我cap deploy,过程超时。Capistrano在使用Amazon RDS部署时超时

这是我deploy.rb:

set :deploy_to, "/opt/bitnami/apps/annarbortshirtcompany.com/cms/" 
set :scm, :git 
set :repository, "ssh://[email protected]/~/repo/cms.git" 
set :deploy_via, :remote_cache 

set :user, "user" 
ssh_options[:keys] = [File.join(ENV["HOME"], "EC2", "admin.pem")] 
ssh_options[:forward_agent] = true 
set :branch, "master" 
set :use_sudo, true 

set :location, "ec2-webserver.compute-1.amazonaws.com" 
role :web, location 
role :app, location 
role :db, "cmsinstance.c7r8frl6npxn.us-east-1.rds.amazonaws.com", :primary => true 

# If you are using Passenger mod_rails uncomment this: 
namespace :deploy do 
    task :start do ; end 
    task :stop do ; end 
    task :restart, :roles => :app, :except => { :no_release => true } do 
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}" 
    end 
end 

的RDS数据库实例的用户名不同于SSH用户名在这里设置,但在我的database.yml定义。我认为这可能不是由capistrano读取的,但不知道如何做到这一点。

当我的“帽子部署”:

[email protected]:~/RailsApps/cms$ cap deploy 
    * executing `deploy' 
    * executing `deploy:update' 
** transaction: start 
    * executing `deploy:update_code' 
    updating the cached checkout on all servers 
    executing locally: "git ls-remote ssh://[email protected]/~/repo/cms.git master" 
    command finished in 1590ms 
    * executing "if [ -d /app-directory/shared/cached-copy ]; then cd /app-directory/shared/cached-copy && git fetch -q origin && git fetch --tags -q origin && git reset -q --hard ffc4ec7762566f801c4a9140aa3980dc71e3d06f && git clean -q -d -x -f; else git clone -q ssh://[email protected]/~/repo/cms.git /app-directory/shared/cached-copy && cd /app-directory/shared/cached-copy && git checkout -q -b deploy ffc4ec7762566f801c4a9140aa3980dc71e3d06f; fi" 
    servers: ["ec2-webserver.compute-1.amazonaws.com", "dbinstance.us-east1.rds.amazonaws.com"] 
*** [deploy:update_code] rolling back 
    * executing "rm -rf /app-directory/releases/20110607161612; true" 
    servers: ["ec2-webserver.compute-1.amazonaws.com", "dbinstance.us-east1.rds.amazonaws.com"] 
** [deploy:update_code] exception while rolling back: Capistrano::ConnectionError, connection failed for: dbinstance.us-east1.rds.amazonaws.com (Errno::ETIMEDOUT: Connection timed out - connect(2)) 
    connection failed for: dbinstance.us-east1.rds.amazonaws.com (Errno::ETIMEDOUT: Connection timed out - connect(2)) 

它为什么要“更新所有服务器上的缓存结账”?现在甚至不需要数据库服务器。我很难理解如何解决这个问题。希望有人能指出我正确的方向!

+0

澄清,一切都指向数据库'时的伟大工程:location'代替RDS实例 – 2011-06-07 18:11:53

回答

25

我有这个确切的问题,并为我尴尬的说是一个好的5或6个小时挣扎。最后,当我意识到问题出在什么地方时,我觉得自己在sma myself自己,因为我知道这一次,但却忘记了它。下面是问题的症结所在,从deploy.rb的这一部分:

set :location, "ec2-webserver.compute-1.amazonaws.com" 
role :web, location 
role :app, location 
role :db, "cmsinstance.c7r8frl6npxn.us-east-1.rds.amazonaws.com", :primary => true 

当你定义Capistrano的机器的角色,您实际上并不确定哪些机器将发挥特殊作用......相反,您正在识别,在应用角色的部署配方时,Capistrano代码将在哪些机器上运行。所以,当你定义:db角色时,你想指向你的EC2实例,而不是的RDS实例。你不能进入RDS机器,所以Capistrano不可能在那里运行配方。相反,点:DB为你指点在同一台机器:网站和:应用程序,即

set :location, "ec2-webserver.compute-1.amazonaws.com" 
role :web, location 
role :app, location 
role :db, location, :primary => true 

怎样的RDS的机器,那么有任何牵连?那么,这是database.yml文件,它指示哪台机器实际上正在运行需要执行SQL的RDBMS。您只需确保您为目标数据库设置主机值:例如:

production: 
    adapter: mysql2 
    encoding: utf8 
    reconnect: false 
    database: <your_db>_production 
    pool: 5 
    username: <username> 
    password: <password> 
    host: cmsinstance.c7r8frl6npxn.us-east-1.rds.amazonaws.com 

是否有意义?

我希望这救了别人我遇到的挫折。

  • 大卫
+2

大卫,这正是它!我希望其他人避免因为你的答案而陷入困境。 – 2011-06-22 14:08:42

+0

确实,将RDS实例的安全组设置为在MySQL端口上接受。 – 2013-10-22 19:32:01

+0

大卫,我跟着你的建议..谢谢,非常清楚..但是我有一个部署问题,在数据库:迁移任务... > Mysql2 ::错误:访问被拒绝用户'root'@172.31。 11.0'(使用密码:NO) 它似乎没有考虑database.yml信用... 试图访问RDS数据库用户root @'ec2实例' – erwin 2015-02-13 22:19:28