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


121

Amazon Elastic Beanstalk宣传册说:

Elastic Beanstalk使您可以“打开引擎盖”并保持完全的控制权,甚至可以通过Elastic Beanstalk控制台传递环境变量。

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

如何传递除Elastic Beanstalk配置中的环境变量之外的其他环境变量?


4
您可能需要考虑更改对此已接受的答案
philipp

Answers:


136

首先向使用该.ebextensions/*.config方法的任何人致意:如今,您可以在Elastic Beanstalk Web界面中添加,编辑和删除环境变量。

变量位于配置→软件配置下:

环境特性

.ebextensions像在Onema的答案中那样创建var 仍然有效。

它甚至可能是更可取的,例如,如果您稍后将部署到另一个环境并且担心忘记手动设置它们,或者您可以将值提交给源代码管理,则可以。我将两者混合使用。


2
或者,您也可以保存配置,并使用该配置启动新环境。
Michael Gallego

1
是的,我想这是最好的选择。我只是忘记了它,而是随意地启动新环境。:)
青柠

1
@dingdong:是的,特别是您可以在应用程序中访问它们。例如,在Rails中ENV["CUSTOM_ENV"]会返回"something-something"
2014年

3
如果我添加新属性或更改属性值,它们是否立即可用,是否需要重新启动等?我最近更改了自动扩展组的规模,AWS终止了几乎所有40个实例,并启动了45个新实例。如果我将新属性添加到现有环境中,我不希望发生这种情况。有任何想法吗?
Engineer81

4
当心最近的变化。按照此答案,它们不会作为环境变量传递。它们仅作为系统属性传递
詹姆斯

107

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

.ebextensions /

然后创建一个名为environment.config的文件(该文件可以叫任何东西,但必须具有.config扩展名)并添加以下值

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

部署应用程序后,您将在Environment Details-> Edit Configuration-> Container下看到此新值

有关更多信息,请在此处查看文档: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

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

更新2 正如@Benjamin在他的评论中所述,由于新外观于2013年7月18日推出,因此可以直接从控制台定义任意数量的环境变量:

Configuration > Software Configuration > Environment Properties


2
@Onema-如何处理向配置文件添加新密钥?推送更新的文件是否会使用占位符值更新所有先前设置的键?
塔布雷兹

1
@Tabrez,任何先前设置的键将保留其值。
Anarchtica

2
抱歉@Tabrez,我之前没有机会进行调查。要添加到Anarchtica答案中,我进行了一些测试,发现如果您使用占位符,然后使用实键更新AWS Console中的值,然后在配置文件中更新占位符值并推送,则不会使用替换为新的占位符。我觉得这有点奇怪,但是我认为这是一种受欢迎的行为,因为您将被迫在控制台中管理所有env值。
Onema 2013年

7
@Anarchtica,我向AWS支持人员询问了此行为。他们说,一旦您在控制台中更新了这些值,它们将具有优先权,并且您将根本无法使用配置文件进行修改。如果您从不更改控制台中的值,则将更新在配置文件中所做的任何更改。
Onema 2013年

1
有谁知道如何在配置文件中将环境变量用于container_commands?我已经尝试过command: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
Colllin 2014年

29

在2016 Java8 Tomcat8 AMI中,ElasticBeanstalk无法从Web配置中设置环境变量。他们实际上是在设置jvm -D属性。

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

该语句对于Java Tomcat ami不正确。亚马逊并没有设置这些为环境变量。它们被设置为系统属性,该属性在命令行中作为jvm的-D属性传递给Tomcat。Java中获取环境变量的方法与获取属性不同。System.getenv与System.getProperty

我把它放在盒子里,并验证了从未设置过环境变量。但是,在tomcat日志中,我可以看到-D属性已设置。

我已经更改了代码,现在可以同时检查两个位置。


对于.Net,按照stackoverflow.com/a/33465765/1991614的要求,它们会插入到您的web.config文件中,而不是放入环境vars中。更令人困惑的问题是,如果该密钥已经存在于web.confg中,则不会插入它们:(
bitcoder

你是我的英雄!感谢您注意到Tomcat 8中的-D属性映射
。– shadowhorst

1
对于像我这样确实需要设置系统环境变量的用户,可以使用内置的beantalk脚本检索这些环境属性。看到这个答案以获取更多信息: serverfault.com/a/770736/292741
BoomShadow

1
Amazon Linux 2017.03 v2.5.4 with Java8也没有设置环境。
Sanoob

2
您无法SSH进入框中并查看变量。它们仅在运行您的应用程序的外壳中设置。docs.aws.amazon.com/elasticbeanstalk/latest/dg / ... In general, however, environment properties are passed only to the application and can't be viewed by connecting an instance in your environment and running env.您的变量未在诸如的登录脚本中设置.bashrc。但是,您正确地将Tomcat变量作为属性传递。(请参阅链接页面的顶部。)
Chloe,

18

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

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

`{ "Ref" : "AWSEBEnvironmentName" }`

或者,您可以使用.ebextensions/*.config和将CloudFormation模板包装在反勾号(`)中:

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

3
晦涩难懂,但正是我想要的。
埃里克·沃克

1
是否有相关文件?我似乎找不到。
yangmillstheory


12

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

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

要查看环境变量: eb printenv


9

环境详细信息->编辑配置->容器

在此处输入图片说明


5

这似乎是在beantalk中用动态值设置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_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 deploy和您的ENVS应该在您的docker容器中可用

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

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

希望这可以帮助!


救生员。如果您具有动态环境变量,例如X: '{“ Ref”:“ MyCache”},'{"Ref": "MyCache"}当容器尝试访问它时,默认情况下不会解析该值(该值仅为' ')。有了它,您可以拥有类似的动态变量。
Petter Kjelkenes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.