如何在亚马逊弹性豆茎(aWS EBS)上传递自定义环境变量?

亚马逊(Amazon)弹性豆茎(Elastic Bean})的广告词写道:

弹性豆茎让您“打开发动机罩”并保持完全控制... 甚至通过弹性豆茎控制台传递环境变量。

Http://aws.amazon.com/elasticbeanstalk/

如何通过其他环境变量以外的一个在弹性豆茎配置?

95110 次浏览

环境详情-> 编辑配置-> 容器

enter image description here

只有5个值是有限制的,或者你可能需要一个自定义的环境变量名称。您可以通过使用配置文件来实现这一点。在项目的根目录下创建一个名为

然后创建一个名为 Environment.config的文件(该文件可以调用任何名称,但必须具有。配置扩展名) ,并添加以下值

option_settings:
- option_name: CUSTOM_ENV
value: staging

部署应用程序之后,您将在 环境详情-> 编辑配置-> 容器

有关详情,请参阅以下文件: Http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

更新

为了防止提交存储库值(如 API 键、 secret 等) ,您可以放置一个占位符值。

option_settings:
- option_name: SOME_API_KEY
value: placeholder-value-change-me

稍后,您可以转到 AWS 管理面板(Environment Details-> Edit Configuration-> Container)并更新那里的值。根据我的经验,这些值在随后的部署之后不会改变。

正如@Benjamin 在他的评论中所说,自从新的 看看,摸摸在2013年7月18日推出以来,可以直接从控制台定义任意数量的环境变量:

Configuration > Software Configuration > Environment Properties

作为任何使用 .ebextensions/*.config方式的人的提示: 现在您可以在 Elastic Beanstalkweb 界面中使用 添加、编辑和删除环境变量。

变量是配置→软件配置:

Environment Properties

.ebextensions中创建类似于 Onema 的回答的变量仍然有效。

它甚至可以是更好的,例如,如果您稍后将部署到另一个环境并担心忘记手动设置它们,或者如果您可以将值提交给源代码控制。我两者都用。

在2016年的 Java8Tomcat8AMI 中,ElasticBean}无法从 web 配置中设置环境变量。它们实际上是在设置 jvm-D 属性。

-- “以下属性作为环境变量传递给应用程序。了解更多信息。”

对于 JavaTomcatami,此语句是不正确的。Amazon 使用 没有将这些变量设置为环境变量。它们被设置为 System 属性,作为 jvm 的 a-D 属性通过命令行传递给 Tomcat。 Java 中获取环境变量的方法与获取属性的方法不同。 Getenv vs System.getProperty

我走进箱子,确认环境变量从来没有设置过。但是,在 tomcat 日志中,我可以看到 -D 属性被设置。

我已经改变了我的代码,以检查这两个位置现在作为一个工作区。

或者,您可以使用 ElasticBeanstalkCLI 来设置环境变量。

设置环境变量: eb setenv FOO=bar

查看环境变量: eb printenv

AWS 将在您的环境变量中解释 CloudForm 模板字符串。您可以使用它来访问应用程序中有关 EB 环境的信息:

在 AWS Web 界面中,以下内容将作为您的环境名称进行评估(请注意后面的勾号) :

`{ "Ref" : "AWSEBEnvironmentName" }`

或者,您可以使用 .ebextensions/*.config并用反勾(‘)包装 CloudForm 模板:

{
"option_settings": [
{
"namespace": "aws:elasticbeanstalk:application:environment",
"option_name": "ENVIRONMENT_NAME",
"value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
}
]
}

这似乎是在 bean 中设置具有动态值的 ENV 的唯一方法。我想出了一个解决方案,适用于我的多码头设置:

1)在构建 + 上传到 ECS 之前,将这个文件添加到 Dockerfile 储存库:

CMD eval `cat /tmp/envs/env_file$`; <base image CMD goes here>;

2)在 Dockerrun.aws.json 文件中创建一个卷:

{
"name": "env-file",
"host": {
"sourcePath": "/var/app/current/envs"
}
}

3)将容量装入容器

{
"sourceVolume": "env-file",
"containerPath": "/tmp/envs",
"readOnly": true
}

4)在你的. ebextensions/options.config 文件中添加一个 Container _ command 这样挡住:

container_commands:
01_create_mount:
command: "mkdir -p envs/"
02_create_env_file:
command: { "Fn::Join" : [ "", [ 'echo "', "export ENVIRONMENT_NAME=" , { "Ref", "RESOURCE" }, ';" > envs/env_file;' ] ] }

5) eb 部署,并且您的 ENVS 应该可以在您的 Docker 容器中使用

您可以通过添加以下命令来添加更多的 ENV:

  02_create_env_file_2:
command: { "Fn::Join" : [ "", [ 'echo "', "export ENVIRONMENT_NAME_2=" , { "Ref", "RESOURCE2" }, ';" >> envs/env_file;' \] \] }

希望这个能帮上忙!