我有一个spring-boot应用程序,我需要指定石墨服务器和端口(发送指标)。为此,我必须安装和配置statsd
。我使用ebextensions
文件。
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
。我正在考虑使用beanstalk控制台/ UI 定义一个名为ENV_NAME
的环境变量,并将其设置为dev
,qa
或prod
根据环境。然后,我可以使用test
的{{1}}选项仅针对基于此container_commands
的特定环境运行04和05命令。
所以我的问题是 - 我如何使用AWS控制台来定义环境变量?我尝试使用Benastalk控制台来定义我的变量,如文档here中所述,但它不起作用。我也found(参见5个upvotes的答案)这个方法只设置JVM属性而不是ENV变量。
我无法使用ENV_NAME
定义环境变量,因为那时我会遇到同样的问题 - 不能为不同的环境定义不同的env变量:)
所以我需要帮助:
ebextensions
环境变量。或者
ENV_NAME
中使用ENV_NAME
系统属性来判断是否根据container_commands
的值运行命令。如果您知道为不同环境指定不同Graphite服务器的更简单/更好的方法,请随时投入。
答案 0 :(得分:18)
我解决此问题的方法是分别在dev和prod环境中将ENV_NAME
定义为dev
和prod
,并使用以下ebextensions
配置。
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
我可以在我已经在beanstalk环境中定义的container command
属性上执行ENV_NAME
。
答案 1 :(得分:5)
除了@Nik的答案:
您也可以获取实际的环境名称并将其自动存储在ENV_NAME
中,而不是手动添加环境变量ENV_NAME
。这可以通过在option_settings
配置文件中使用ebextensions
来实现。
例如:
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脚本的人:测试表达式中的空格很重要(example)。
答案 2 :(得分:1)
答案是在今年春天documentation,但我会用我的话说一点: 由于您运行的是spring-boot应用程序,因此可以创建不同的“application.properties”文件,如下所示:
在每个文件中,您可以放置石墨(或其他)配置:
在我的application-dev.yml中:
在我的应用程序-prod.yml:
正如您所看到的,每个环境都有一个配置。
您可以使用不同的maven配置文件运行您的应用程序,在这种情况下,让我们说:dev和prod ...在我的情况下,我的'dev'配置文件默认设置,所以当应用程序启动时它会加载dev配置文件因此,application-dev.yml配置。
我的pom.xml的片段
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
...
然后,当您使用每个配置文件运行应用程序时,它将加载所需的.yml文件
让我们看看,如果我跑:
java -jar mywar.war
我的控制台加载开发配置文件(因为记住它是我的默认配置文件)
但如果我指定prod配置文件,例如:
java -jar mywar.war --spring.profiles.active=prod
我的控制台将显示:
要在Elastic Beanstalk中设置环境变量,请转到Configuration - &gt;软件配置:
并设置spring.profile.active
,如下所示:
最后一条评论:不要将环境属性与环境标记混淆!