我将在Elastic Beanstalk上运行Rails应用程序,我将同时拥有Web和Worker环境。问题是,由于它们共享相同的代码,我需要在工作环境(初始化工作进程)和Web上的一些特定脚本(初始化应用服务器)上运行一些特定的ebextensions。如何将.ebextensions文件夹中的不同文件夹上的两个脚本分开,然后根据环境变量告诉Elastic Beanstalk运行?
谢谢,
答案 0 :(得分:3)
这是一种不理想但有效的方法。始终在所有环境中运行相同的步骤。编写shell脚本以封装要有条件运行的命令。让shell脚本测试是否存在环境变量,并在设置了该环境变量的情况下运行命令。 以下是如何实现此目的的说明:
.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
RUN_WORKER_JOB
使用AWS控制台,选择要运行命令的环境。打开Software Configuration
工具并设置名为RUN_WORKER_JOB
的环境变量。确保未在您不希望命令运行的环境中设置环境变量。
设置约定并以一致的方式调用脚本,变量和文件:worker_job.sh
,worker_job.config
,RUN_WORKER_JOB
等......
答案 1 :(得分:0)
总而言之,我认为这是一个缺少的功能,AWS应该在未来提供一流的支持,或者更明显和连贯的一流支持 - saved configurations帮助EB选项设置和资源(额外定制)基础设施),但我不认为它们可以包含实例上的命令,它们与.ebextensions
的区别和优先级是混乱的,让团队必须理解这一点令人困惑(您可以在{{{{}}中定义资源和设置1}}文件或保存的配置...)。 EB显然是为一个应用程序设计的,具有多个环境,因此.ebextensions
不知道这一点似乎显而易见。
像@ yacc这样的解决方案适用于可归结为环境之间脚本的微小差异的情况,这可能足以满足OP的问题。虽然它变得混乱,并且对于EB配置和自定义资源而不是on-instance命令没有任何帮助,例如我只想要enable a bunch of custom CloudWatch metrics或a 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
将起作用)。