如何在Amazon Elastic Beanstalk(AWS EBS)上传递自定义环境variables?

Amazon Elastic Beanstalk Blurb说:

Elastic Beanstalk可让您“打开引擎盖”并保留完全控制,甚至通过Elastic Beanstalk控制台传递环境variables。

http://aws.amazon.com/elasticbeanstalk/

如何传递Elastic Beanstalkconfiguration中的其他环境variables?

作为使用.ebextensions/*.config方式的人员,现在您可以在Elastic Beanstalk Web界面中添加,编辑和删除环境variables。

这些variables在configuration→软件configuration下:

环境属性

在Onema的答案中创build.ebextensions的variables仍然有效。

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

只有5个值是有限的,或者你可能想要一个自定义的环境variables名称。 您可以使用configuration文件来做到这一点。 在您的项目的根目录下创build一个目录

.ebextensions /

然后创build一个名为environment.config的文件(该文件可以被调用,但必须具有.config扩展名)并添加以下值

 option_settings: - option_name: CUSTOM_ENV value: staging 

部署应用程序后,您将在“环境详细信息” – >“编辑configuration” – >“容器”下看到此新值

有关更多信息,请在此处查看文档: http : //docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

更新

为了防止提交到您的存储库值,如API密钥,秘密等,你可以把一个占位符值。

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

稍后,您可以转到AWSpipe理面板(环境详细信息 – >编辑configuration – >容器)并更新那里的值。 根据我的经验,这些值在后续部署后不会改变。

Update 2正如@Benjamin在他的评论中指出的那样,自2013年7月18日推出新外观以来,可以直接从控制台定义任意数量的环境variables:

Configuration > Software Configuration > Environment Properties

在2016年Java8 Tomcat8 AMI中,ElasticBeanstalk无法从Webconfiguration中设置环境variables。 他们确实设置了jvm -D属性。

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

此语句对于Java Tomcat ami不正确。 亚马逊不会将这些设置为环境variables。 它们被设置为通过命令行传递给Tomcat的系统属性,作为jvm的-D属性。 Java中获取环境variables的方法与获取属性不同。 System.getenv与System.getProperty

我ssh进入框中,并validation环境variables从未设置。 但是,在tomcat日志中,我可以看到-D属性被设置。

我已经改变了我的代码来检查两个位置现在作为一种解决方法。

环境详细信息 – >编辑configuration – >容器

在这里输入图像描述

AWS将在您的环境variables中解释CloudFormation模板string。 您可以使用它来访问您的应用程序中有关您的EB环境的信息:

在AWS Web界面中,以下内容将被评估为您的环境的名称(请注意后面的标记):

 `{ "Ref" : "AWSEBEnvironmentName" }` 

或者,您可以使用.ebextensions/*.config模板封装在后面(`)中:

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

或者,您可以使用Elastic Beanstalk CLI设置环境variables。

设置一个环境variables: eb setenv FOO=bar

查看环境variables: eb printenv

这似乎是在beanstalk中设置具有dynamic值的ENV的唯一方法。 我想出了一个适用于我的多docker设置的解决方法:

1)在构build+上传到ECS存储库之前,将其添加到Dockerfile中:

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

2)在你的Dockerrun.aws.json文件中创build一个卷:

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

3)将卷装入容器

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

4)在.ebextensions / options.config文件中添加一个container_commands块,如下所示:

 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部署,您的Docker容器中应该提供您的ENVS

您可以通过添加更多的container_commands来添加更多的ENV:

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

希望这可以帮助!

如果您使用AWSpipe理控制台,则只需转到:

configuration>软件configuration>环境属性

在这里输入图像描述