我在 Elastic Beanstalk 上使用 Ruby 2.7,如 AWS 文档中所述。我正在运行 Rails 6.1.4.1。耙子是 13.0.6.
Beanstalk 是否执行
db:migrate
应该取决于RAILS_SKIP_MIGRATIONS
的值,默认为false。我通过将它包含在我的 .ebextensions
设置中来双重确定它是真的,我看到它正在执行:
commands:
01_install_yarn:
command: npm install yarn -g
02_symlink_yarn:
command: ln -s -f "$(npm bin --global)"/yarn /usr/bin/yarn
03_install_dependencies:
command: yum install postgresql-devel
option_settings:
aws:elasticbeanstalk:application:environment:
RAILS_SKIP_MIGRATIONS: false
事实上,我确定这个值是false,因为当我连接到它时,我可以在Beanstalk实例上看到它。
如果你通过 ssh 连接到主机并运行
sudo cat /opt/elasticbeanstalk/deployment/env
,你会看到环境的转储——所有这些配置参数,以及注入的 RDS 变量。非常方便调试:
$ sudo cat /opt/elasticbeanstalk/deployment/env
PATH=/opt/elasticbeanstalk/.rbenv/shims:/opt/elasticbeanstalk/.rbenv/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
RACK_ENV=production
RAILS_SKIP_MIGRATIONS=false
RAILS_SKIP_ASSET_COMPILATION=false
BUNDLE_WITHOUT=test:development
(etc)
然而,
/var/log/eb-engine.log
始终跳过迁移并显示:
2021/11/11 23:17:52.261630 [INFO] Running command /bin/su webapp -c bundle exec /opt/elasticbeanstalk/config/private/checkforraketask.rb db:migrate
2021/11/11 23:17:57.083890 [INFO] Found db:migrate task in Rakefile
2021/11/11 23:17:57.083955 [INFO] Skipping db:migrate task (RAILS_SKIP_MIGRATIONS=true).
2021/11/11 23:17:57.083968 [INFO] Executing instruction: configure log streaming
是真不是假!而且我一辈子都弄不明白为什么。
我可能会用
container_command
来回避这个问题以强制执行任务,但我真的很想知道发生了什么。这是 Beanstalk 中的错误吗?我似乎无法进一步追踪它; checkforraketask
看起来像这样:
require 'rake'
Dir.chdir '/var/app/staging'
Rake.application.init
Rake.application.load_rakefile
tasks = Rake.application.tasks.collect(&:name)
exit 0 if tasks.include? ARGV[0]
exit 1
和
Rakefile
像这样:
require_relative "config/application"
Rails.application.load_tasks
lib/tasks
中没有任务,所以我假设此输出来自最后一行?我卡住了。如何让 Beanstalk 识别正确的值并运行迁移?
我也很想知道这个问题的答案
作为解决方法,我创建了以下 ebextension 来解决问题:
.ebextensions/03_rake-db-migrate.config
container_commands:
rake_db_migrate:
command: "RAILS_ENV=production bundle exec rake db:migrate"
您是否正在跳过资产编译(RAILS_SKIP_ASSET_COMPILATION=true)?
就我而言,当为真时,迁移也在跳过。
对我来说,我使用 Elastic Beanstalk“环境属性”(在配置下)设置
RAILS_SKIP_MIGRATIONS=false
。虽然它也没有被捡起来。
我使用此命令直接获取所有环境变量,并设置它们(默认情况下比 EB 早),现在它默认尊重该环境变量:
export $(cat /opt/elasticbeanstalk/deployment/env | xargs)
要在正确的时间运行,请将其放入如下文件中:
.platform/hooks/prebuild/09_fetch_env_vars_early.sh
,在文件顶部有一个 bash shebang,如下所示:#!/bin/bash
.
要验证它是否有效,请查看
/var/log/eb-engine.log
,它应该如下所示:
[INFO] Found db:migrate task in Rakefile
[INFO] Running command /bin/su webapp -c bundle exec rake db:migrate
您可以使用
eb-engine.log
命令查看eb logs
,或者在部署后通过eb ssh
'ing到服务器。