为 Rails 应用程序创建 AWS Elastic Beanstalk 环境时出错
Posted
技术标签:
【中文标题】为 Rails 应用程序创建 AWS Elastic Beanstalk 环境时出错【英文标题】:Error while creating AWS Elastic Beanstalk Environment for Rails Application 【发布时间】:2018-06-19 06:08:22 【问题描述】:创建 Elastic Beanstalk 环境时出现以下错误
实例上的命令失败。返回码:1 输出:(截断)... ^ /var/app/ondeck/config/environment.rb:5:in
<top (required)>' /opt/rubies/ruby-2.4.3/bin/bundle:23:in
load' /opt/rubies/ruby-2.4.3/bin/bundle:23:in `' 任务:TOP => db:migrate => environment(通过运行任务查看完整跟踪 - 痕迹)。挂钩 /opt/elasticbeanstalk/hooks/appdeploy/pre/12_db_migration.sh 失败。 有关更多详细信息,请使用控制台或 EB 检查 /var/log/eb-activity.log 命令行界面。
在 /var/log/eb-activity.log 文件中,我发现以下错误 -
任务:TOP => db:migrate => 环境(通过运行查看完整跟踪 带有--trace 的任务) (Executor::NonZeroExitStatus)
AppDeployStage0/AppDeployPreHook/12_db_migration.sh]:活动失败。
AppDeployStage0/AppDeployPreHook]:活动失败。
AppDeployStage0]:活动失败。
应用程序更新 - CommandCMD-AppDeploy 失败
【问题讨论】:
请发布更多/所有/var/log/eb-activity.log
文件,以便我们帮助找出迁移失败的原因。
我很想知道 rake db:migrate
在本地是否正常工作。
【参考方案1】:
在将 Elastic Beanstalk 与外部 Amazon RDS 数据库一起使用时,我遇到了同样的问题。基本上,问题在于 Elastic Beanstalk 预部署脚本会在数据库存在之前尝试迁移它。
我发现了两种解决方法。
第一种方法是在您的应用配置中设置RAILS_SKIP_MIGRATIONS=true
环境变量。这应该允许您至少部署代码库。之后,您可以使用eb ssh
进入应用程序,浏览到/var/app/current/
文件夹,然后手动运行bundle exec rails db:create
和bundle 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
环境变量。
【讨论】:
以上是关于为 Rails 应用程序创建 AWS Elastic Beanstalk 环境时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 AWS Elastic Beanstalk / Rails 上配置 HTTPS
无法通过 .ebextensions 文件更改 AWS 中的 tomcat 配置