如何在Amazon Elastic Beanstalk(Python)中设置环境变量

如何在Amazon Elastic Beanstalk(Python)中设置环境变量,python,amazon-web-services,environment-variables,amazon-elastic-beanstalk,Python,Amazon Web Services,Environment Variables,Amazon Elastic Beanstalk,我最近一直在开发Django应用程序,试图让它与Amazon Elastic Beanstalk一起工作 在我的.ebextensions/python.config文件中,我设置了以下内容: option_settings: - namespace: aws:elasticbeanstalk:application:environment option_name: ProductionBucket value: s3-bucket-name - namespace:

我最近一直在开发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
eb local setenv CONFIG=dev
eb local run
但是,每当我查看服务器时,都不会设置这样的环境变量(因此,当我尝试
os.getenv('ProductionBucket')

我遇到了这样一个问题,它似乎试图记录所有的名称空间。我也尝试使用
PARAM1
作为选项名,但得到了类似的结果

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

编辑
我还尝试在所有其他仅导出环境变量的命令之前添加一个命令:

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

…这也是不成功的

我使用一个现代(即非传统)容器进行了检查,并在/opt/elasticbeanstalk/deploy/configuration/containerconfiguration下找到了一个json文件

这种行为似乎依赖于平台:我特别记得在PHP中,它还创建了一些带有值的shell脚本

不管怎样,请查看/opt/elasticbeanstalk/hooks/configdeploy

Java case同样,它运行这个python脚本,看起来非常方便:


我也有同样的问题

信不信由你,在部署之前,必须将
.ebextensions
目录和所有
*.config
文件提交到版本控制,以便它们在服务器上显示为环境变量

为了使敏感信息不受版本控制,可以使用如下配置文件:

option_settings:
  - option_name: API_LOGIN
    value: placeholder
  - option_name: TRANS_KEY
    value: placeholder
  - option_name: PROVIDER_ID
    value: placeholder
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())))'"
然后在AWS管理面板(配置>软件配置>环境属性)中编辑配置并更新其中的值


您可能也会发现有帮助。

我执行了以下操作,以获取在非容器阶段在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
在elastic beanstalk的配置文件中,如下所示:

option_settings:
  - option_name: API_LOGIN
    value: placeholder
  - option_name: TRANS_KEY
    value: placeholder
  - option_name: PROVIDER_ID
    value: placeholder
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())))'"

选项1:

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

您可以使用
eb printenv

选项2:

您可以在.ebextensions目录中创建一个配置文件,例如
00\u environment.config
。然后,添加如下环境变量:

option_settings:
  - option_name: API_LOGIN
    value: placeholder
  - option_name: TRANS_KEY
    value: placeholder
  - option_name: PROVIDER_ID
    value: placeholder
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())))'"

选项设置:
-选项名称:我的第一个环境变量
价值:abc
-选项名称:另一个环境变量
价值:123

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

我还发现
eb config
命令非常有用:

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


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

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

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
eb local setenv CONFIG=dev
eb local run

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

我知道这是一个老问题,但对于那些仍然有相同问题的人来说,就像我在这里做的一样,AWS文档提供了解决方案:

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

  • 打开,然后在“区域”下拉列表中打开 列表中,选择您所在的地区

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

  • 在导航窗格中,选择配置

  • 在软件配置类别中,选择编辑

  • 在环境属性下,输入键值对

  • 选择应用

  • 也许PARAM1等用于此?似乎是一个很大的限制。这可能也有帮助-您是否尝试过使用
    aws:elasticbeanstalk:application:environment:varname
    ?我已经尝试过这些方法,但同样没有成功:我将在本周晚些时候尝试使用aws EB,这将让您知道我的做法。而这当然可以解释环境变量是如何设置的,我希望通过配置文件可以提供一些相关信息。查看
    /hooks/configdeploy
    文件夹内容。无论何时设置环境设置(包括配置),都会运行此文件。您必须记录并查看基于python的环境,因为它是一个不同的Beast eb deploy如何知道使用00_environment.config而不是01_environment.config?@Learner它按字母顺序加载所有
    .ebextensions/*.config
    文件。请参阅:
    配置文件按字母顺序执行。例如,.ebextensions/01run.config是在.ebextensions/02do.config之前执行。
    @idrinkpabst afaik。如果使用.ebignore文件,则在部署时,版本控制可以忽略.ebextensions(如果您在任何配置文件中有一些敏感信息,则应该忽略)。请参阅