我有一个spring-boot应用程序,我需要为其指定石墨服务器和端口(发送指标)。为此,我必须安装和配置statsd
。我使用电子扩展
文件来做到这一点。
commands:
01_nodejs_install:
command: sudo yum -y install nodejs npm --enablerepo=epel
ignoreErrors: true
02_mkdir_statsd:
command: mkdir /home/ec2-user/statsd
ignoreErrors: true
03_fetch_statsd:
command: git clone https://github.com/etsy/statsd.git /home/ec2-user/statsd
ignoreErrors: true
04_change_example_config:
command: "cat exampleConfig.js | sed 's/2003/<graphite-port>/g' | sed 's/graphite.example.com/<my-graphite-server>/g' > config.js"
cwd: /home/ec2-user/statsd
05_run_statsd:
command: setsid node stats.js config.js >/dev/null 2>&1 < /dev/null &
cwd: /home/ec2-user/statsd
此配置的问题是我只能在此处为所有环境指定1个石墨服务器。
所以我决定将命令04和05移动到container_commands
中。我正在考虑使用beanstik控制台/UI定义一个名为ENV_NAME
的环境变量,并根据环境将其设置为dev
、qa
或prod
。然后我可以使用container_commands
的test
选项,仅针对特定环境运行04和05命令。
所以我的问题是——我如何使用AWS控制台来定义环境变量?我尝试使用豆茎控制台来定义我的变量,正如这里的留档中所解释的那样,但它不起作用。我还发现(参见5个赞成票的答案)这个方法只设置了JVM属性,而不是ENV变量。
我无法使用ebExsionsions
定义环境变量,因为那样我就会遇到同样的问题-无法为不同的env定义不同的env var:)
所以我需要帮助:
ENV_NAME
环境变量。或者
中使用ENV_NAME
系统属性的方法container_commands
根据ENV_NAME
的值来决定是否运行命令。如果您知道一种更简单/更好的方法来为不同的环境指定不同的石墨服务器,请随时加入。
我解决这个问题的方法是在dev和prod环境中分别将ENV_NAME
定义为dev
和prod
,并使用以下eb扩展
配置。
commands:
01_nodejs_install:
command: sudo yum -y install nodejs npm --enablerepo=epel
ignoreErrors: true
02_mkdir_statsd:
command: mkdir /home/ec2-user/statsd
ignoreErrors: true
03_fetch_statsd:
command: git clone https://github.com/etsy/statsd.git /home/ec2-user/statsd
ignoreErrors: true
container_commands:
04a_container_change_example_config:
command: "cat exampleConfig.js | sed 's/2003/<graphite-dev-port>/g' | sed 's/graphite.example.com/<graphite-dev-host>/g' > config.js"
cwd: /home/ec2-user/statsd
test: '[ "${ENV_NAME}" == "dev" ]'
04b_container_change_example_config:
command: "cat exampleConfig.js | sed 's/2003/<graphite-prod-port>/g' | sed 's/graphite.example.com/<graphite-prod-host>/g' > config.js"
cwd: /home/ec2-user/statsd
test: '[ "${ENV_NAME}" == "prod" ]'
05_run_statsd:
command: setsid node stats.js config.js >/dev/null 2>&1 < /dev/null &
cwd: /home/ec2-user/statsd
使用test
,我可以将容器命令
的执行限制在我已经在beanstik环境中定义的ENV_NAME
属性上。
除了@Nik的回答:
除了手动添加环境变量ENV_NAME
之外,您还可以获取实际的环境名称并将其自动存储在ENV_NAME
中。这是使用ebendsions
配置文件中的option_settings
来实现的。
例如:
option_settings:
aws:elasticbeanstalk:application:environment:
ENV_NAME: '`{ "Ref" : "AWSEBEnvironmentName" }`' # assign the actual env name to ENV_NAME
container_commands:
0100_execute_only_in_dev:
command: echo "this is the development environment" # this will turn up in ebactivity.log
test: '[[ $ENV_NAME = "dev" ]]'
附带说明,对于那些不太熟悉shell脚本的人,比如我:测试表达式中的空格很重要(示例)。
截至2021年,AmazonLinux2是新标准,AmazonLinux2使用平台钩子,而不是. ebExsionsions
中的container_commands
。
这是一个相当于上面定义的0100_execute_only_in_dev
容器命令的bash脚本,可以用作AmazonLinux2上的平台挂钩:
0100_execute_only_in_dev.sh
#!/bin/bash
if [ $ENV_NAME = "dev" ]
# the following output will end up in "/var/log/eb-hooks.log"
then echo "this is the development environment"
fi
外壳脚本需要执行权限,如此处所述,并且可以放置在源代码包中的.平台/hooks
和/或.平台/confighooks
的任何子目录中,具体取决于适用的部署阶段(prebuild
、预部署
或post部署
)。有关详细信息,请参阅部署工作流程。它还有助于检查/var/log/eb-engine. log
,以查看部署期间到底发生了什么。
请注意,平台挂钩还可以访问EB环境属性。
答案在这个Spring留档中,但我要用我的话来说一点:由于您正在运行一个spring-boot应用程序,您可以创建不同的“application.properties”文件,如下所示:
在每个文件中,您可以放置石墨(或任何)配置:
在我的应用程序-dev. yml中:
在我的应用程序-prod. yml中:
如您所见,每个环境都有一个配置。
您可以使用不同的maven配置文件运行您的应用程序,在这种情况下,让我们说:dev和prod…在我的情况下,默认设置了我的“dev”配置文件,因此当应用程序启动时,它将加载dev配置文件,因此,会加载applation-dev. yml配置文件。
我的pom. xml片段
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
...
然后,当您使用每个配置文件运行应用程序时,它将加载所需的. yml文件
让我想想,如果我跑:
java -jar mywar.war
我的控制台加载开发配置文件(因为记住它是我的默认配置文件)
但是,如果我指定产品配置文件,例如:
java -jar mywar.war --spring.profiles.active=prod
我的控制台将显示:
要在弹性豆茎中设置环境变量,请转到配置-
并设置Spring. profile.active
,如下所示:
最后一条评论:不要将环境属性与环境标签混淆!