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

时间:2018-01-10 06:01:36

标签: ruby-on-rails postgresql amazon-web-services elastic-beanstalk

我在创建Elastic Beanstalk环境时遇到错误

  

实例上的命令失败。返回码:1输出:(TRUNCATED)... ^   /var/app/ondeck/config/environment.rb:5:in ;WITH CTE_Parent AS ( SELECT Name,Teaches,COUNT(*) OVER() AS Parent_Count FROM @Teachers WHERE Name = 'Dave' ) SELECT T.Name FROM @Teachers AS T INNER JOIN CTE_Parent AS C ON C.Name <> T.Name AND C.Teaches= T.Teaches GROUP BY T.Name,C.Parent_Count HAVING COUNT(*) = C.Parent_Count loading&#39;   /opt/rubies/ruby-2.4.3/bin/bundle:23:in`&#39;任务:TOP =&gt;   db:migrate =&gt;环境(通过运行任务查看完整跟踪    - 跟踪)。挂钩/opt/elasticbeanstalk/hooks/appdeploy/pre/12_db_migration.sh失败。   有关更多详细信息,请使用控制台或EB检查/var/log/eb-activity.log   CLI。

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

  

任务:TOP =&gt; db:migrate =&gt;环境(通过运行查看完整跟踪   任务--trace)(Executor :: NonZeroExitStatus)

     

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

     

AppDeployStage0 / AppDeployPreHook]:活动失败。

     

AppDeployStage0]:活动失败。

     

应用程序更新 - CommandCMD-AppDeploy失败

1 个答案:

答案 0 :(得分: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 /文件夹中创建app预部署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环境变量。