如何在亚马逊弹性豆荚(Python)中设置环境变量

14

最近我一直在开发一个Django应用程序,试图使其与Amazon Elastic Beanstalk协同工作。

在我的.ebextensions/python.config文件中,我进行了以下设置:

option_settings:
  - namespace: aws:elasticbeanstalk:application:environment
    option_name:  ProductionBucket
    value: s3-bucket-name
  - namespace: aws:elasticbeanstalk:application:environment
    option_name:  ProductionCache
    value:  memcached-server.site.com:11211

然而,每当我查看服务器时,都没有设置这样的环境变量(因此,在我尝试使用os.getenv('ProductionBucket')时无法访问)。

我找到了这个页面,它似乎试图记录所有命名空间。我也尝试将PARAM1用作选项名称,但结果类似。

如何在Amazon Elastic Beanstalk中设置环境变量?

编辑:
我还尝试在所有其他命令之前添加一个命令,只是为了导出一个环境变量:

commands:
 01_env_vars:
  command: "source scripts/env_vars"

这也没有成功。


也许 PARAM1 等变量用于这个?不过似乎是一个很大的限制。https://dev59.com/Fmgu5IYBdhLWcg3wloLA - Alex L
这可能也会有所帮助 - http://grigory.ca/2012/09/getting-started-with-django-on-aws-elastic-beanstalk/ - Alex L
你尝试过使用aws:elasticbeanstalk:application:environment:varname吗? - Alex L
我已经尝试过那些方法,但同样没有成功:S - NT3RP
本周稍后我会尝试在AWS EB上进行测试,之后会告诉你我的进展情况。 - Alex L
我在 Ruby on Rails 平台上遇到了同样的问题。 - idrinkpabst
6个回答

19

我遇到了同样的问题。

不管信不信,你需要将 .ebextensions 目录和所有的 *.config 文件提交到版本控制中,然后再部署,这样它们才会显示为服务器上的环境变量。

为了避免敏感信息进入版本控制,可以使用像这样的配置文件:

option_settings:
  - option_name: API_LOGIN
    value: placeholder
  - option_name: TRANS_KEY
    value: placeholder
  - option_name: PROVIDER_ID
    value: placeholder

接着到AWS管理面板中编辑配置(Configuration > Software Configuration > Environment Properties)并更新那里的值。

你可能会发现这个答案有帮助。


据我所知,.ebextensions可以被版本控制忽略(如果您在任何配置文件中有一些敏感信息,则应该这样做),当您使用.ebignore文件部署时。请参见https://forums.aws.amazon.com/message.jspa?messageID=621059#621059。 - arturomp

6

选项1:

您可以使用eb setenv FOO=bar设置环境变量。

您可以使用eb printenv查看环境变量。

选项2:

您可以在您的.ebextensions目录中创建一个配置文件,例如00_environment.config。然后,像这样添加您的环境变量:

option_settings: - option_name: MY_FIRST_ENV_VAR value: abc - option_name: ANOTHER_ENV_VAR value: 123

但是,如果您有多个环境,则直接使用选项#1设置环境变量更加有用。

我还发现eb config命令很有用:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-config.html

这些命令允许您在eb环境上获取、放置、列出或删除配置文件。

命令eb config get将保存您的配置,包括环境变量,到本地文件.elasticbeanstalk/saved_configs中。


eb deploy 如何知道使用 00_environment.config 而不是 01_environment.config? - Learner
@Learner 它按字母顺序加载所有.ebextensions/*.config文件。请参阅文档配置文件按字母顺序执行。例如,.ebextensions/01run.config在.ebextensions/02do.config之前执行。 - Brandon

5
我还进行了以下操作,以便在非容器阶段(例如常规命令)中获得我在CloudFormation中配置的环境变量。
/opt/elasticbeanstalk/bin/get-config environment | python -c "import json,sys; obj=json.load(sys.stdin); f = open('/tmp/eb_env', 'w'); f.write('\n'.join(map(lambda x: 'export ' + x[0] + '=' + x[1], obj.iteritems())))"

执行此命令后,您将在 /tmp/eb_env 中拥有一个文件,其中包含所有环境变量。在需要使用环境变量的命令之前执行以下命令即可。
source /tmp/eb_env

示例

source /tmp/eb_env && echo $MY_CUSTOM_ENV

在弹性 Beanstalk 的配置文件中,它是这样的:
commands:
    02-make-sure-we-can-get-our-env-in-the-instance-itself:
        command: "/opt/elasticbeanstalk/bin/get-config environment | python -c 'import json,sys; obj=json.load(sys.stdin); f = open(\'/tmp/eb_env\', \'w\'); f.write(\'\n\'.join(map(lambda x: \'export \' + x[0] + \'=\' + x[1], obj.iteritems())))'"

2
我使用了现代(即非遗留)容器进行了检查,发现它位于/opt/elasticbeanstalk/deploy/configuration/containerconfiguration下作为json文件。
行为似乎取决于平台:我记得在PHP中,它还会创建一些带有值的shell脚本。
不管怎样,请查看/opt/elasticbeanstalk/hooks/configdeploy。
再次以Java为例,它运行这个Python脚本,看起来对你很方便:

https://gist.github.com/19c1e4b718f9a70a4ce1


1
虽然这确实揭示了环境变量是如何设置的,但我希望能有一些关于通过配置文件进行此操作的信息。 - NT3RP
查看 /hooks/configdeploy 文件夹的内容。每当您设置环境设置(包括配置)时,将运行此文件。您必须记录并查看Python环境,因为它是一种不同的实体。 - aldrinleal

1

我知道这是一个旧问题,但对于那些仍然有与我一样的问题的人,这里是来自AWS文档的解决方案: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-softwaresettings.html

在Elastic Beanstalk控制台中配置环境属性

  1. 打开Elastic Beanstalk控制台,然后在区域下拉列表中选择您的区域。

  2. 在导航窗格中,选择环境,然后在列表中选择您的环境名称。

  3. 在导航窗格中,选择配置

  4. 软件配置类别中,选择编辑。

  5. 环境属性下,输入键值对。

  6. 选择应用

1

要在本地运行中设置变量,您可以执行以下操作:

eb local setenv CONFIG=dev
eb local run

这也适用于Docker MultiContainers,否则它们将无法看到您的环境。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接