如何在elasticbeanstalk上执行自定义预部署脚本?

时间:2017-01-09 18:08:08

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

我在ec2实例上托管了一个rails应用程序(rails 3.2.1,ruby 1.9.3以防万一)。在部署到新实例时,部署失败,因为没有种子,并且预部署脚本(12_db_migrate.sh)首先运行导致其失败。手动播种数据库然后运行迁移修复它。

我想在.ebextensions下创建预部署脚本(我不想在... appdeploy / pre /下手动创建脚本,因为当我在新实例上部署应用程序时,这对我没有帮助,比如说)今天有可能吗?

PS:我知道我不希望它在每次部署时播种,所以我想通过环境变量实现这一目标。

2 个答案:

答案 0 :(得分:1)

我认为最好的选择可能是重新评估您的迁移依赖于之前播种的特定数据的原因,但无论我相信您都可以通过files密钥完成您想要的操作。

像这样的东西可能会成功 - 我复制12_db_migration.sh并将其修剪成只做种子。通过将前缀设置为09_,它将在迁移之前运行。

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/09_seed_database.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
        #!/usr/bin/env bash

        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

        . $EB_SCRIPT_DIR/use-app-ruby.sh

        cd $EB_APP_STAGING_DIR

        su -s /bin/bash -c "leader_only bundle exec rake db:seed" $EB_APP_USER

答案 1 :(得分:0)

通过添加包含类似

之类的文件.ebextensions/packages.config,您可以告诉弹性beanstalk在部署前运行container_commands
container_commands:
  01_node_install_if_not_installed:
    cwd: /tmp
    test: '[ ! -f /usr/bin/node ] && echo "node not installed"'
    command: 'echo "e" > tst.txt'
    leader_only: true
  • cwdtestleader_only是可选的。
  • command仅在test评估为真时才会运行
  • leader_only设置是否在第一个ec2实例上执行此操作(如果您使用的是多个)

PS!您不能使用eb setenv来设置在此阶段应该执行的环境变量,因为这些环境变量由webapp用户使用,而这些命令是以root运行的。