提问者:小点点

特定于环境的扩展Beanstatk命令


我有一个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的环境变量,并根据环境将其设置为devqaprod。然后我可以使用container_commandstest选项,仅针对特定环境运行04和05命令。

所以我的问题是——我如何使用AWS控制台来定义环境变量?我尝试使用豆茎控制台来定义我的变量,正如这里的留档中所解释的那样,但它不起作用。我还发现(参见5个赞成票的答案)这个方法只设置了JVM属性,而不是ENV变量。

我无法使用ebExsionsions定义环境变量,因为那样我就会遇到同样的问题-无法为不同的env定义不同的env var:)

所以我需要帮助:

  • 使用豆茎UI设置ENV_NAME环境变量。

或者

  • 建议在中使用ENV_NAME系统属性的方法container_commands根据ENV_NAME的值来决定是否运行命令。

如果您知道一种更简单/更好的方法来为不同的环境指定不同的石墨服务器,请随时加入。


共3个答案

匿名用户

我解决这个问题的方法是在dev和prod环境中分别将ENV_NAME定义为devprod,并使用以下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,如下所示:

最后一条评论:不要将环境属性与环境标签混淆!

  • 环境属性:我刚刚向您展示的:环境变量。
  • 环境标签:资源的弹性豆茎标签,如此处所述