特定于环境的ebextensions命令

时间:2016-06-08 03:30:18

标签: java amazon-web-services environment-variables elastic-beanstalk ebextensions

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

所以我的问题是 - 我如何使用AWS控制台来定义环境变量?我尝试使用Benastalk控制台来定义我的变量,如文档here中所述,但它不起作用。我也found(参见5个upvotes的答案)这个方法只设置JVM属性而不是ENV变量。

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

所以我需要帮助:

  • 使用beanstalk UI设置ebextensions环境变量。

或者

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

如果您知道为不同环境指定不同Graphite服务器的更简单/更好的方法,请随时投入。

3 个答案:

答案 0 :(得分:18)

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

enter image description here

在每个文件中,您可以放置​​石墨(或其他)配置:

在我的application-dev.yml中:

enter image description here

在我的应用程序-prod.yml:

enter image description here

正如您所看到的,每个环境都有一个配置。

您可以使用不同的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

我的控制台加载开发配置文件(因为记住它是我的默认配置文件)

enter image description here

但如果我指定prod配置文件,例如:

java -jar mywar.war --spring.profiles.active=prod

我的控制台将显示:

enter image description here

要在Elastic Beanstalk中设置环境变量,请转到Configuration - &gt;软件配置:

enter image description here

并设置spring.profile.active,如下所示:

enter image description here

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

  • 环境属性:我刚刚向您展示的内容:环境变量。
  • 环境标记:资源的Elastic Beanstalk标记,如here
  • 所述