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

Ben*_*Ben 115 app-config amazon-web-services amazon-elastic-beanstalk

Amazon Elastic Beanstalk blurb说:

Elastic Beanstalk让您"打开引擎盖"并保持完全控制...甚至通过Elastic Beanstalk控制台传递环境变量.

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

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

lim*_*ime 132

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

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

环境属性

.ebextensionsOnema的答案中创建变量仍然有效.

它甚至可能是优选的,例如,如果您稍后将部署到另一个环境并且害怕忘记手动设置它们,或者您可以将值提交到源控件.我使用两者的混合.

  • 谨防最近的变化.根据这个[答案](http://stackoverflow.com/a/36567121/2110188),它们不会作为环境变量传递.它们仅作为系统属性传递 (4认同)
  • 如果我添加新属性或更改属性值,它们是否立即可用,是否需要重新启动任何内容等?我最近更改了自动缩放组的大小,AWS终止了几乎所有40个实例,并启动了45个新实例.如果我向现有环境添加新属性,我不希望发生这种情况.有任何想法吗? (3认同)
  • 或者,您也可以保存配置,并使用配置启动新环境. (2认同)

One*_*ema 107

只有5个值是限制性的,或者您可能希望拥有自定义环境变量名称.您可以使用配置文件执行此操作.在项目的根目录下创建一个名为的目录

.ebextensions /

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

option_settings:
  - option_name: CUSTOM_ENV
    value: staging
Run Code Online (Sandbox Code Playgroud)

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

有关更多信息,请查看此处的文档: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
Run Code Online (Sandbox Code Playgroud)

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

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

Configuration > Software Configuration > Environment Properties

  • @Anarchtica,我向AWS支持询问了这种行为.他们说,一旦你更新控制台中的值,它们将优先,你将无法使用配置文件修改它们.如果您从未更改控制台中的值,则将更新配置文件中所做的任何更改. (7认同)
  • @Onema - 如何处理在配置文件中添加新密钥?推送更新的文件是否会使用占位符值更新所有先前设置的键? (2认同)
  • 抱歉@Tabrez,我之前没有机会进行调查。要添加到Anarchtica答案中,我进行了一些测试,发现如果您使用占位符,然后使用实键更新AWS Console中的值,然后在配置文件中更新占位符值并推送,则不会使用替换为新的占位符。我觉得这有点奇怪,但是我认为这是一种受欢迎的行为,因为您将被迫在控制台中管理所有env值。 (2认同)

Ed *_*d J 27

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

- "以下属性作为环境变量传递到应用程序.了解更多信息."

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

我ssh进入框中并验证环境变量从未设置过.但是,在tomcat日志中我可以看到-D属性已设置.

我已经更改了我的代码以检查这两个位置现在是一种解决方法.

  • 您无法SSH进入框中并查看变量。它们仅在运行您的应用程序的外壳中设置。https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-softwaresettings.html?icmpid=docs_elasticbeanstalk_console#environments-cfg-softwaresettings-accessing不过,通常,环境属性仅传递给应用程序,无法通过在环境中连接实例并运行env来查看。`变量未在.bashrc之类的登录脚本中设置。但是,您正确地将Tomcat变量作为属性传递。(请参阅链接页面的顶部。) (2认同)

小智 13

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

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

`{ "Ref" : "AWSEBEnvironmentName" }`
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用.ebextensions/*.config并在后面的刻度(`)中包装CloudFormation模板:

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "ENVIRONMENT_NAME",
      "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 模糊不清,但正是我所寻找的. (3认同)

小智 11

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

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

要查看环境变量: eb printenv


Ben*_*Ben 9

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

在此输入图像描述


小智 5

这似乎是在beantalk中用动态值设置ENV的唯一方法。我想出了一种适用于我的多码头工人设置的解决方法:

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

CMD eval `cat /tmp/envs/env_file$`; <base image CMD goes here>;
Run Code Online (Sandbox Code Playgroud)

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

{
    "name": "env-file",
    "host": {
        "sourcePath": "/var/app/current/envs"
    }
}
Run Code Online (Sandbox Code Playgroud)

3)将体积安装到容器上

{
  "sourceVolume": "env-file",
  "containerPath": "/tmp/envs",
  "readOnly": true
}
Run Code Online (Sandbox Code Playgroud)

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;' ] ] }
Run Code Online (Sandbox Code Playgroud)

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;' \] \] }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!