18

我有一个 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. 我正在考虑ENV_NAME 使用 beanstalk 控制台/UI定义一个名为的环境变量,并根据环境将其设置为devqa或。prod然后我可以使用test选项container_commands04 和 05 仅针对基于此的特定环境运行命令ENV_NAME

所以我的问题是 - 我如何使用 AWS 控制台来定义环境变量?我尝试使用 Beanstalk 控制台来定义我的变量,如此处文档中所述 但它不起作用。我还发现(请参阅 5 个赞成的答案)此方法仅设置 JVM 属性而不设置 ENV 变量。

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

所以我需要帮助:

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

或者

  • 建议一种使用ENV_NAME系统属性的方法,container_commands以根据 的值来判断是否运行命令ENV_NAME

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

4

3 回答 3

28

我解决这个问题的方法是分别定义ENV_NAMEasdevprodin 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

于 2016-06-22T22:58:47.943 回答
14

除了@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 脚本的人:测试表达式中的空格很重要示例)。

更新:

截至 2021 年,Amazon Linux 2 是新标准。Amazon Linux 2 使用平台挂钩而不是container_commandsin .ebextensions.

这是一个等效于0100_execute_only_in_dev上面定义的容器命令的 bash 脚本,可用作 Amazon Linux 2 上的平台挂钩:

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

shell 脚本需要执行权限,如此所述,并且可以放置在源包的任何子目录中.platform/hooks和/或.platform/confighooks中,具体取决于适用的部署阶段(prebuild、、predeploypostdeploy)。有关详细信息,请参阅部署工作流程。它还有助于检查/var/log/eb-engine.log,了解部署期间究竟发生了什么。

请注意,平台挂钩也可以访问 EB 环境属性。

于 2018-10-25T09:51:00.063 回答
2

答案在这个 Spring文档中,但我会用我的话说:由于您正在运行一个 spring-boot 应用程序,您可以创建不同的“application.properties”文件,如下所示:

在此处输入图像描述

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

在我的应用程序-dev.yml 中:

在此处输入图像描述

在我的 application-prod.yml 中:

在此处输入图像描述

如您所见,每个环境都有一个配置。

您可以使用不同的 Maven 配置文件运行您的应用程序,在这种情况下,假设:dev 和 prod... 在我的情况下,我的“dev”配置文件是默认设置的,因此当应用程序启动时它将加载开发配置文件,因此, application-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

我的控制台将显示:

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

  • 环境属性:我刚刚向您展示的那些:环境变量。
  • 环境标签:资源的 Elastic Beanstalk 标签,如此处所述
于 2016-06-17T22:06:23.363 回答