为 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:inload' /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: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环境变量。

【讨论】:

以上是关于为 Rails 应用程序创建 AWS Elastic Beanstalk 环境时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Elastic Beanstalk / Rails 上配置 HTTPS

将 Rails 连接到 AWS MySQL 数据库

无法通过 .ebextensions 文件更改 AWS 中的 tomcat 配置

将 React 应用程序部署到 AWS

在 AWS 弹性 beantalk 上使用 webpacker gem 部署 rails react 应用程序

使用 AWS Elastic Beanstalk 部署 rails 应用程序时管理迁移