我将在 Elastic Beanstalk 上运行 Rails 应用程序,并且我将拥有 Web 和 Worker 环境。问题是,由于它们共享相同的代码,我需要在工作环境中运行一些特定的 ebextensions(以初始化工作进程)和在 Web 上运行一些特定的脚本(以初始化应用服务器)。如何将 .ebextensions 文件夹内不同文件夹中的两个脚本分开,然后根据环境变量告诉 Elastic Beanstalk 运行?
谢谢,
我将在 Elastic Beanstalk 上运行 Rails 应用程序,并且我将拥有 Web 和 Worker 环境。问题是,由于它们共享相同的代码,我需要在工作环境中运行一些特定的 ebextensions(以初始化工作进程)和在 Web 上运行一些特定的脚本(以初始化应用服务器)。如何将 .ebextensions 文件夹内不同文件夹中的两个脚本分开,然后根据环境变量告诉 Elastic Beanstalk 运行?
谢谢,
这是一种不理想但有效的方法。始终在所有环境中运行相同的步骤。编写一个 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
等...
总而言之,我认为这是 AWS 应该在未来提供一流支持的缺失功能,或者更明显和连贯的一流支持—<a href="https://docs.aws.amazon.com/elasticbeanstalk /latest/dg/command-options.html" rel="nofollow noreferrer">为 EB 选项设置和资源(额外的自定义基础设施)保存的配置帮助,但我不相信它们可以包含实例命令及其区别并且优先级.ebextensions
对于团队来说是混乱和混乱的(您可以在.ebextensions
文件或保存的配置中定义资源和设置......)。EB 显然是为具有多个环境的一个应用程序设计的,因此对此.ebextensions
一无所知似乎很明显。
@yacc 之类的解决方案适用于归结为环境之间脚本存在细微差异的情况,这可能足以解决 OP 的问题。但是它变得很混乱,并且对于 EB 配置和自定义资源而不是实例命令完全没有帮助,例如,如果我想启用一堆自定义 CloudWatch 指标或仅用于生产和/的多实例 ElastiCache 集群或工作环境,但不是暂存。
为此,保存的配置可以帮助:
$ 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
我从保存的配置中删除任何秘密,例如敏感的环境变量值,然后检查.elasticbeanstalk/saved_configs
源代码管理以在将来进行可重复的环境重新创建。(这篇 [有用的] 文章建议将文件移动到的根目录.elasticbeanstalk/
可能更适合 CLI 的.gitignore
约定)。当然,您可以在 Web 控制台中进行首次生产环境设置,然后保存并修改它,而不是从 staging 的副本开始。
也有可能使用CloudFormation 资源条件函数.ebextensions
在文件中实现其中的一些功能——我还没有尝试过,但如果我有机会找到 EB 提供给 CloudFormation 的输入参数,我会更新我的答案(看起来喜欢会工作)。 AWSEBEnvironmentName