在 AWS Elastic Beanstalk 上运行 rake db:seed

Posted

技术标签:

【中文标题】在 AWS Elastic Beanstalk 上运行 rake db:seed【英文标题】:Running rake db:seed on AWS Elastic Beanstalk 【发布时间】:2014-12-26 18:12:05 【问题描述】:

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

所以,我放弃了,决定直接通过 ssh 进入我的 EC2 实例并从那里运行它。但是,这对我也不起作用。我 cd 进入 var/app/current,然后运行 ​​rake db:seed RAILS_ENV=production。它似乎运行了一两分钟,然后在退出前输出“killed”。

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

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

【问题讨论】:

【参考方案1】:

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

更改后,我可以连接到我的 AWS RDS 实例,并且可以很好地为一条记录播种。但是,当我尝试播种整个 500k 记录时,它仍然被杀死。我正在使用 AWS 免费套餐,因此我认为出于性能原因,他们的微型实例不允许长时间运行进程。为了解决这个问题,我创建了一个 rake 任务,它将我的 seed.rb 文件拆分成一堆较小的文件,例如,seeds-01.rb 到 seed-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 命令行工具部署我的应用程序后,我进入我的实例并运行我的 bash 脚本。

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

这确保文件足够小,不会超时。

【讨论】:

以上是关于在 AWS Elastic Beanstalk 上运行 rake db:seed的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Elastic Beanstalk 上扩展 Magento

如何在 AWS Elastic Beanstalk 上设置 HTTPS

如何在 AWS Elastic Beanstalk 上设置 HTTPS

在 AWS Elastic Beanstalk 上运行节点和反应

如何使用 aws cli 在 Elastic Beanstalk 上上传和部署?

在aws elastic beanstalk上上传文件?