131

Amazon Elastic Beanstalk 简介说:

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

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

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

4

7 回答 7

153

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

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

环境属性

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

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

于 2013-07-26T10:08:13.567 回答
109

只有 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

于 2013-01-23T23:25:55.243 回答
29

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

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

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

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

作为一种解决方法,我已经更改了我的代码以检查这两个位置。

于 2016-04-12T08:03:09.353 回答
19

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

在 AWS Web 界面中,以下内容将被评估为您的环境名称(注意反引号):

`{ "Ref" : "AWSEBEnvironmentName" }`

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

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "ENVIRONMENT_NAME",
      "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
    }
  ]
}
于 2016-08-15T18:59:30.470 回答
14

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

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

查看环境变量:eb printenv

于 2016-07-18T23:20:08.893 回答
9

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

在此处输入图像描述

于 2012-06-26T17:06:33.127 回答
5

这似乎是在 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 容器中可用

您可以通过添加更多容器命令来添加更多 ENV,例如:

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

希望这可以帮助!

于 2016-11-17T00:32:06.853 回答