在AWS Elastic Beanstalk上运行rake db:seed

时间:2014-10-30 15:45:51

标签: ruby-on-rails amazon-web-services amazon-ec2 elastic-beanstalk

我尝试使用Elastic Beanstalk部署我的第一个rails应用程序,并且我已经达到了需要使用大约五十万条记录为我的数据库建立种子的程度。我最初的尝试是在我的.ebextensions文件夹中创建一个.config文件,然后从命令行使用git aws.push,但它一直给我超时错误。

所以,我放弃了,并决定直接ssh到我的EC2实例并从那里运行它。但是,这也不适合我。我进入var / app / current,然后运行rake db:seed RAILS_ENV = production。它似乎运行了一两分钟,然后输出“杀死”#39;在退出之前。

我还尝试只播放一条记录,只是为了查看文件的大小是否与它有关。如果我这样做,它会弹出一个错误,告诉我我的SQLITE数据库是只读的。我非常确定我的数据库设置为在生产中使用MySQL,我更改了database.yml以使用各种ENV变量,当我从命令行运行eb status时,它告诉我正在使用MySQL。

奇怪的是,我发誓我昨天早些时候完成了这些完全相同的步骤,对数据库进行了整理和播种,并且有效。唯一的问题是我做了一些更改,终止了应用程序并决定重新开始,现在它根本不起作用。我有什么想法,我做错了什么?这是一个Rails 4.1 / Ruby 2.1设置。

1 个答案:

答案 0 :(得分:1)

所以,我在不久前就开始工作,我想应该回答这个问题。我的第一个问题是我搞砸了database.yml。我省略了适配器:mysql2行,所以它试图连接到sqlite数据库,因此只读错误。

一旦我改变了,我就可以连接到我的AWS RDS实例,我可以播放一条记录就好了。然而,当我试图播种整个500k记录时,它仍然被杀死。我使用AWS免费套餐,所以我认为他们的微实例不会因为性能原因而允许长时间运行的流程。为了解决这个问题,我创建了一个rake任务,将我的seeds.rb文件拆分为一堆较小的文件,例如seed-01.rb到seeds-1000.rb。

desc "Splits a file into smaller subfiles"
task :subfiles, [:filename, :num_files] => :environment do |task, args|
  lines = File.readlines(args[:filename])
  num_files = args[:num_files].to_i
  lines_per_file = lines.count / num_files
  extension = File.extname(args[:filename])
  basename = File.basename(args[:filename])
  puts lines_per_file.to_s
  puts lines.count.to_s
  num_files.times do |num_file|
    subfile = File.open(basename + "-#{num_file}" + extension, "w")
    subline_start = num_file*lines_per_file
    subline_end = (num_file+1)*lines_per_file-1
    subline_end = lines.count-1 if num_file == num_files-1
    sublines = lines[subline_start..subline_end].each do |subline|
      subfile.puts subline
    end
    subfile.close
  end
end

然后,我生成了一个bash脚本来运行每个文件,如下所示:

rails runner seeds-01.rb
rails runner seeds-02.rb
...
rails runner seeds-1000.rb

应该注意的是,我也尝试了以下内容,无论出于何种原因,它比使用rails runner慢得多。

sudo cp seeds-01.rb seeds.rb
rake db:seed
...
sudo cp seeds-1000.rb seeds.rb
rake db:seed

所以不要这样做。那么,在我使用弹性beanstalk命令行工具来部署我的应用程序之后,我将sshed到我的实例中并运行我的bash脚本。

cd /var/app/current/db
bash bash-script.txt

这确保了文件足够小以至于它停止了超时。