Тайм-аут Capistrano при развертывании с использованием Amazon RDS - PullRequest
8 голосов
/ 07 июня 2011

Я не могу заставить Capistrano хорошо играть с AmazonRDS. Я искал повсюду информацию о правильной настройке, но не нашел ее. Прямо сейчас, когда я cap deploy, процесс истекает.

Это мой deploy.rb:

set :deploy_to, "/opt/bitnami/apps/annarbortshirtcompany.com/cms/" 
set :scm, :git
set :repository,  "ssh://user@ec2-repository.compute-1.amazonaws.com/~/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. Я полагаю, что Капистрано, вероятно, не читает это, но понятия не имеет, как это сделать.

Когда я "ограничиваю развертывание":

ubuntu@ubuntu-VirtualBox:~/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://user@ec2-repository.compute-1.amazonaws.com/~/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://user@ec2-repository.amazonaws.com/~/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))

Зачем ему "обновлять кэшированную проверку на всех серверах"? Сервер БД на этом этапе даже не нужен. Я в тупик, как это исправить. Надеюсь, кто-то может указать мне правильное направление!

1 Ответ

26 голосов
/ 21 июня 2011

У меня была именно эта проблема, и я боролся с ней из-за того, что мне было стыдно сказать, это были хорошие 5 или 6 часов.В конце концов, когда я понял, в чем проблема, я почувствовал, как чмокаю себя, потому что я знал это однажды, но забыл об этом.Вот суть проблемы, начиная с этой части 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 на ту же машину, на которую вы указываете: web и: app, то есть

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

Какое отношение имеет тогда машина RDS?Ну, это файл database.yml, который определяет, на каком компьютере в действительности выполняется СУБД, где должен выполняться SQL.Вам просто нужно убедиться, что вы устанавливаете значение host: для целевой базы данных, например:

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

Имеет смысл?

Я надеюсь, что это спасет кого-то еще от разочарования, которое я испытал.

  • Давид
...