当前位置: 首页 > 知识库问答 >
问题:

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

陆啸
2023-03-14

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

tasks:TOP=>db:migrate=>environment(通过运行任务查看完整跟踪)(executor::nonzeroexitstatus)

AppDeploystage0/AppDeployPrehook/12_db_migration.sh]:活动失败。

共有1个答案

童华池
2023-03-14

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

我发现了两种方法来解决这个问题。

第一种方法是在应用程序配置上设置rails_skip_migrations=true环境变量。这样至少可以部署代码库。之后,可以使用EB SSHshell到应用程序中,浏览到/var/app/current/文件夹,并手动运行bundle exec rails db:createbundle exec rails db:migrate

在项目中创建一个名为/.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 repo,然后运行EB Deploy

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

 类似资料:
  • 我正在工作一个AWS弹性Beanstalk应用程序,上传文件到AWS S3桶。Beanstalk应用程序是一个.NET Core Web API应用程序,我遵循了本指南(http://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-netcore.html),并且在磁盘上有一个凭据文件,用于本地开发,其中有我的共享访

  • 我正在按照这些说明在弹性Beanstalk管理的EC2实例上启用HTTPS。我可以看到弹性Beanstalk创建/etc/pki/Tls/certs/server.crt&/etc/pki/Tls/certs/server.key文件。但是,弹性Beanstalk没有创建/etc/httpd/conf.d/ssl.conf文件。但是,在环境创建后手动创建/etc/httpd/conf.d/ssl.

  • 我使用CF模板创建Beanstalk环境。我想在创建环境时通过SNS触发Lambda代码,这样我就可以使用Lambda触发jenkins作业,并对新环境进行集成测试。 有没有办法在Beanstek中成功创建env后发送SNS消息?我已经定义了一个订阅lambda代码的主题。 beanstalk API允许您定义通知endpoint。http://docs.aws.amazon.com/elasti

  • 我正在考虑是否可以根据应用程序部署到的Beanstalk环境将React应用程序设置为具有特定的环境变量。 我的目标是使预编译的react代码具有特定于该环境的环境变量。我希望避免向用户提供具有所有环境变量的JS代码 是否可以使用MsBuild条件,以便根据所选的Beanstalk环境运行不同的构建脚本?或者可能是基于Beanstalk内部环境变量的条件?

  • 将子域名别名到弹性Beanstalk环境ELBs的正确路由配置是什么? 我已将Amazon Route 53托管区域ID表中的s复制到映射: 我的资源有两个豆茎环境: 输出: 阶段和prod Beanstrk环境都在工作,即它们响应对的调用,以及由(看起来像)。毫不奇怪,证书是无效的,因为它期望域名是或。 现在我尝试添加Route 53配置: 当我尝试更新云形成堆栈时,我在AWS控制台中得到以下错