环境属性不会传递到 Elastic Beanstalk 中的应用程序

问题描述 投票:0回答:4

部署我的 Django 项目时,未配置数据库设置,因为

'RDS_HOSTNAME' in os.environ
返回
false
。事实上,部署时没有可用的环境属性。所有这些属性在部署后都可用。

运行

/opt/elasticbeanstalk/bin/get-config environment
返回以下内容:

{"DJANGO_SETTINGS_MODULE":"myApp.settings","PYTHONPATH":"/var/app/venv/staging-LQM1lest/bin:$PYTHONPATH","RDS_DB_NAME":"ebdb","RDS_HOSTNAME":"xxxx.amazonaws.com","RDS_PASSWORD":"xxxx","RDS_PORT":"xxxx","RDS_USERNAME":"xxxx"}

所有 RDS 前缀属性均已设置,但仍不知何故

os.environ
无法读取它。

setting.py
文件:

# [...]

if 'RDS_HOSTNAME' in os.environ:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.environ['RDS_DB_NAME'],
            'USER': os.environ['RDS_USERNAME'],
            'PASSWORD': os.environ['RDS_PASSWORD'],
            'HOST': os.environ['RDS_HOSTNAME'],
            'PORT': os.environ['RDS_PORT'],
        }
    }

# [...]

我是否需要进行任何更改才能使这些属性在部署时可用?

python django database amazon-web-services amazon-elastic-beanstalk
4个回答
5
投票

看起来这是一个严重的错误,AWS 并不关心它。我想出了几种方法来完成这项工作,但所有这些方法都需要登录 EB 环境并进行一些手动工作。

解决方案1

正如hephalump

评论中所建议的
  1. 创建 AWS 秘密管理器

  2. 检查 EB 环境中的

    IAM instance profile
    Configuration->Security->Edit

  3. 然后转到 IAM 用户控制台并转到

    Roles
    。从那里您可以将策略附加到秘密管理器的实例配置文件。

  4. 完成后,部署项目

  5. 然后登录环境(

    eb ssh environment_name
    )。

  6. 转到

    /var/app/current/
    目录并运行以下命令:
    source /var/app/venv/*/bin/activate

  7. 终于跑了

    python3 manage.py migrate

解决方案2

  1. 编辑

    .bash_profile
    并在文件末尾添加导出这些变量:

     export RDS_DB_NAME=your_dbname
     export RDS_USERNAME=user
     export RDS_PASSWORD=pass
     export RDS_HOSTNAME=host_endpoint
     export RDS_PORT=3306
    
  2. 运行

    source ~/.bash_profile

  3. 现在您可以部署您的项目了。

解决方案3

  1. 在 EB 环境配置中设置所有环境属性。 (转到
    Configuration->Software->Edit->Environment properties
    并添加键和值)。

2.在

settings.py

的开头添加此片段
    from pathlib import Path
    import os
    import subprocess
    import ast


    def get_environ_vars():
        completed_process = subprocess.run(
            ['/opt/elasticbeanstalk/bin/get-config', 'environment'],
            stdout=subprocess.PIPE,
            text=True,
            check=True
        )

        return ast.literal_eval(completed_process.stdout)
  1. 转到数据库部分并将其替换为此代码片段

     if 'RDS_HOSTNAME' in os.environ:
         DATABASES = {
             'default': {
             '    ENGINE': 'django.db.backends.mysql',
                  'NAME': os.environ['RDS_DB_NAME'],
                  'USER': os.environ['RDS_USERNAME'],
                  'PASSWORD': os.environ['RDS_PASSWORD'],
                  'HOST': os.environ['RDS_HOSTNAME'],
                  'PORT': os.environ['RDS_PORT'],
         }
     }
     else:
         env_vars = get_environ_vars()
         DATABASES = {
             'default': {
             'ENGINE': 'django.db.backends.mysql',
             'NAME': env_vars['RDS_DB_NAME'],
             'USER': env_vars['RDS_USERNAME'],
             'PASSWORD': env_vars['RDS_PASSWORD'],
             'HOST': env_vars['RDS_HOSTNAME'],
             'PORT': env_vars['RDS_PORT'],
         }
     }
    
  2. 部署项目。

  3. 登录环境(

    eb ssh environment_name
    )。

  4. 转到

    /var/app/current/
    目录并运行以下命令:
    source /var/app/venv/*/bin/activate

  5. 终于跑了

    python3 manage.py migrate

结论:

解决方案 1 有点复杂,秘密管理器不是免费的(仅限 30 天试用)。
解决方案 2最简单,但我确实不建议在 EB 上手动调整任何文件。
解决方案 3 是我将使用的干净的解决方案。该解决方案还可以在将来修复此错误。


3
投票

在系统中使用环境属性,例如。运行 Symfony 命令(使用 envs)你可以简单地运行这个:

/opt/elasticbeanstalk/bin/get-config environment | jq -r "to_entries|map(\"export \(.key)='\(.value|tostring)'\")|.[]" >> /home/ec2-user/.bash_profile 

它将在 .bash_profile 中添加您的所有属性,因此当您通过 SSH 登录时,它们将全部设置完毕。当然,最好将其添加到命令:部分下的 .ebextensions/*.config 中。


2
投票

AWS官方提供的从EC2级别提供环境变量的解决方案也解决了这个问题:

https://aws.amazon.com/premiumsupport/knowledge-center/elastic-beanstalk-env-variables-shell/


0
投票

基于 @Jarek.D 提到的文章AWS Elastic-Beanstalk env Variables Shell我们采取了一种额外的方法,以便您可以使用项目中 python 的 os.environment.get() 方法读取环境变量。我们创建了一个执行的 process.sh 文件:

source /etc/profile.d/sh.local
source /var/app/venv/[your_staging]/bin/activate
python your_file.py
© www.soinside.com 2019 - 2024. All rights reserved.