为 Rails 应用程序创建 AWS Elastic Beanstalk 环境时出错



我在创建弹性豆茎环境时遇到以下错误

实例上的命令失败。返回代码:1 输出:(TRUNCATED)... ^/var/app/ondeck/config/environment.rb:5:in<top (required)>' /opt/rubies/ruby-2.4.3/bin/bundle:23:inload'/opt/rubies/ruby-2.4.3/bin/bundle:23:in '' 任务: 顶部 =>db:迁移 => 环境(通过运行任务查看完整跟踪 --跟踪)。Hook/opt/elasticbeanstalk/hooks/appdeploy/pre/12_db_migration.sh 失败。 有关更多详细信息,请使用控制台或 EB 检查/var/log/eb-activity.log 命令行界面。

在/var/log/eb-activity.log 文件中,我发现了以下错误 -

任务:顶部 => db:migrate => 环境(通过运行查看完整跟踪 任务与 --trace) (执行器::非零退出状态)

AppDeployStage0/AppDeployPreHook/12_db_migration.sh]:活动失败。

AppDeployStage0/AppDeployPreHook] :活动失败。

AppDeployStage0] : 活动失败。

应用程序更新 - 命令 CMD-AppDeploy 失败

在将 Elastic Beanstalk 与外部 Amazon RDS 数据库配合使用时,我遇到了同样的问题。基本上,问题在于 Elastic Beanstalk 预部署脚本会尝试在数据库存在之前迁移数据库。

我发现了两种解决此问题的方法。

第一种方法是在应用配置上设置RAILS_SKIP_MIGRATIONS=true环境变量。这应该允许您至少部署代码库。之后,您可以使用eb ssh外壳进入应用程序,浏览到/var/app/current/文件夹,然后手动运行bundle exec rails db:createbundle exec rails db:migrate

解决此问题的另一种方法是在/opt/elasticbeanstalk/hooks/appdeploy/pre/文件夹中创建一个应用程序预部署 shell 脚本钩子文件。

我使用了/opt/elasticbeanstalk/hooks/appdeploy/pre/12_db_migration.sh 文件作为参考,这就是我想出的。

在项目中创建一个名为/.ebextensions/0001_rails_db_create.config的文件,其中包含以下内容:

files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/11_create_db.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
set -xe
EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)
EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
. $EB_SUPPORT_DIR/envvars
RAKE_TASK="db:create"
. $EB_SCRIPT_DIR/use-app-ruby.sh
cd $EB_APP_STAGING_DIR
if su -s /bin/bash -c "bundle exec $EB_SCRIPT_DIR/check-for-rake-task.rb $RAKE_TASK" $EB_APP_USER; then
if [ "$RAILS_SKIP_DB_CREATE" = "true" ]; then
echo "Skipping database creation (RAILS_SKIP_DB_CREATE=true)."
else
su -s /bin/bash -c "leader_only bundle exec rake db:create" $EB_APP_USER
fi
else
echo "No $RAKE_TASK task in Rakefile, skipping database creation."
fi

将该文件提交到 git 存储库,然后运行eb deploy

这应该创建 shell 脚本钩子文件,如果它不存在,它将创建 rails db。数据库迁移 shell 脚本挂钩文件应紧随其后运行,因为它的名称以数字 12 开头。

此脚本就绪后,如果要绕过它,可以在应用上设置RAILS_SKIP_DB_CREATE=true环境变量。

最新更新