Amazon Elastic Beanstalk宣传册说:
Elastic Beanstalk使您可以“打开引擎盖”并保持完全的控制权,甚至可以通过Elastic Beanstalk控制台传递环境变量。
http://aws.amazon.com/elasticbeanstalk/
如何传递除Elastic Beanstalk配置中的环境变量之外的其他环境变量?
Amazon Elastic Beanstalk宣传册说:
Elastic Beanstalk使您可以“打开引擎盖”并保持完全的控制权,甚至可以通过Elastic Beanstalk控制台传递环境变量。
http://aws.amazon.com/elasticbeanstalk/
如何传递除Elastic Beanstalk配置中的环境变量之外的其他环境变量?
Answers:
首先向使用该.ebextensions/*.config
方法的任何人致意:如今,您可以在Elastic Beanstalk Web界面中添加,编辑和删除环境变量。
变量位于配置→软件配置下:
.ebextensions
像在Onema的答案中那样创建var 仍然有效。
它甚至可能是更可取的,例如,如果您稍后将部署到另一个环境并且担心忘记手动设置它们,或者您可以将值提交给源代码管理,则可以。我将两者混合使用。
ENV["CUSTOM_ENV"]
会返回"something-something"
。
仅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
command: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
在2016 Java8 Tomcat8 AMI中,ElasticBeanstalk无法从Web配置中设置环境变量。他们实际上是在设置jvm -D属性。
-“以下属性作为环境变量传递到应用程序中。了解更多。”
该语句对于Java Tomcat ami不正确。亚马逊并没有设置这些为环境变量。它们被设置为系统属性,该属性在命令行中作为jvm的-D属性传递给Tomcat。Java中获取环境变量的方法与获取属性不同。System.getenv与System.getProperty
我把它放在盒子里,并验证了从未设置过环境变量。但是,在tomcat日志中,我可以看到-D属性已设置。
我已经更改了代码,现在可以同时检查两个位置。
Amazon Linux 2017.03 v2.5.4 with Java8
也没有设置环境。
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变量作为属性传递。(请参阅链接页面的顶部。)
AWS将在您的环境变量中解释CloudFormation模板字符串。您可以使用它来访问有关应用程序内部EB环境的信息:
在AWS Web界面中,以下内容将作为您的环境名称进行评估(注意反斜线):
`{ "Ref" : "AWSEBEnvironmentName" }`
或者,您可以使用.ebextensions/*.config
和将CloudFormation模板包装在反勾号(`)中:
{
"option_settings": [
{
"namespace": "aws:elasticbeanstalk:application:environment",
"option_name": "ENVIRONMENT_NAME",
"value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
}
]
}
这似乎是在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"}
当容器尝试访问它时,默认情况下不会解析该值(该值仅为' ')。有了它,您可以拥有类似的动态变量。