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

时间:2012-06-26 15:42:26

标签: amazon-web-services app-config elastic-beanstalk

Amazon Elastic Beanstalk blurb说:

  

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

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

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

7 个答案:

答案 0 :(得分:126)

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

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

Environment Properties

.ebextensions中{{1}}中创建变量仍然有效。

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

答案 1 :(得分:103)

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

的目录

<强> .ebextensions /

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

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

部署应用程序后,您将看到此新值 环境详情 - &gt;编辑配置 - &gt;容器

有关更多信息,请查看此处的文档: 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管理面板(环境详细信息 - &gt;编辑配置 - &gt;容器)并更新其中的值。根据我的经验,这些值在后续部署后不会改变。

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

Configuration > Software Configuration > Environment Properties

答案 2 :(得分:26)

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

- &#34;以下属性作为环境变量传递给应用程序。了解更多。&#34;

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

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

我已将我的代码更改为现在检查这两个位置作为解决方法。

答案 3 :(得分:11)

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

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

`{ "Ref" : "AWSEBEnvironmentName" }`

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

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

答案 4 :(得分:9)

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

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

查看环境变量:eb printenv

答案 5 :(得分:8)

环境详情 - &gt;编辑配置 - &gt;容器

enter image description here

答案 6 :(得分:4)

这似乎是在beanstalk中使用动态值设置ENV的唯一方法。我想出了一个适用于我的多Docker设置的解决方法:

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;' \] \] }

希望这有帮助!