2011-06-07 54 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