如何根据环境在Elastic Beanstalk上运行条件脚本?

时间:2015-08-18 18:23:21

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

我将在Elastic Beanstalk上运行Rails应用程序,我将同时拥有Web和Worker环境。问题是,由于它们共享相同的代码,我需要在工作环境(初始化工作进程)和Web上的一些特定脚本(初始化应用服务器)上运行一些特定的ebextensions。如何将.ebextensions文件夹中的不同文件夹上的两个脚本分开,然后根据环境变量告诉Elastic Beanstalk运行?

谢谢,

2 个答案:

答案 0 :(得分:3)

这是一种不理想但有效的方法。始终在所有环境中运行相同的步骤。编写shell脚本以封装要有条件运行的命令。让shell脚本测试是否存在环境变量,并在设置了该环境变量的情况下运行命令。 以下是如何实现此目的的说明:

1 /添加配置文件.ebextensions/worker_job.config

files:
  "/home/webapp/worker_job.sh" :
    mode: "000755"
    owner: webapp
    group: webapp
    content: |
      #!/bin/sh
      if [ -z "$RUN_WORKER_JOB" ]; then
        echo 'RUN_WORKER_JOB is not set, skipping RUN_WORKER_JOB';
      else
        echo 'RUN_WORKER_JOB is set, running RUN_WORKER_JOB'
        # run useful worker commands
      fi

container_commands:
  00_worker_job:
    command: /home/webapp/worker_job.sh

2 /在所选环境中设置RUN_WORKER_JOB

使用AWS控制台,选择要运行命令的环境。打开Software Configuration工具并设置名为RUN_WORKER_JOB的环境变量。确保未在您不希望命令运行的环境中设置环境变量。

注意:

设置约定并以一致的方式调用脚本,变量和文件:worker_job.shworker_job.configRUN_WORKER_JOB等......

答案 1 :(得分:0)

总而言之,我认为这是一个缺少的功能,AWS应该在未来提供一流的支持,或者更明显和连贯的一流支持 - saved configurations帮助EB选项设置和资源(额外定制)基础设施),但我不认为它们可以包含实例上的命令,它们与.ebextensions的区别和优先级是混乱的,让团队必须理解这一点令人困惑(您可以在{{{{}}中定义资源和设置1}}文件或保存的配置...)。 EB显然是为一个应用程序设计的,具有多个环境,因此.ebextensions不知道这一点似乎显而易见。

像@ yacc这样的解决方案适用于可归结为环境之间脚本的微小差异的情况,这可能足以满足OP的问题。虽然它变得混乱,并且对于EB配置和自定义资源而不是on-instance命令没有任何帮助,例如我只想要enable a bunch of custom CloudWatch metricsa multi-instance ElastiCache cluster用于生产和/或工作环境,但不用于分期。

为此,保存的配置可以提供帮助:

.ebextensions

我从敏感的环境变量值中删除保存的配置中的任何秘密,然后将$ eb config save staging $ cp .elasticbeanstalk/saved_configs/{staging,production}-sc.cfg.yml # Add production-specific option settings, resources, etc.: $ $EDITOR .elasticbeanstalk/saved_configs/production-sc.cfg.yml # Save the config to S3: $ eb config put production --cfg production-sc # Apply the config to the environment: $ eb config production --cfg production-sc 检查到源控件中,以便将来重复环境娱乐。 (This [useful] article建议将文件移动到.elasticbeanstalk/saved_configs的根目录可能更适合CLI的.elasticbeanstalk/约定。当然,您可以在Web控制台中进行首次生产环境设置,然后保存并修改它,而不是从分段副本开始。

也可以在.gitignore文件中使用CloudFormation condition functions获取资源中的部分内容 - 我还没有尝试过这个但是如果我有机会找到它我会更新我的答案EB为CloudFormation提供的输入参数(it looks like .ebextensions将起作用)。