为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

DIEA 2023-12-29 16:01:06
部署我的 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'],        }    }# [...]我是否需要进行任何更改才能使这些属性在部署时可用?
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

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

解决方案1

  1. 创建 AWS 秘密管理器

  2. 检查IAM instance profileEB的环境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并添加键和值)。

https://img1.sycdn.imooc.com/658e7d1d00014e0006190116.jpg

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)

转到数据库部分并将其替换为此代码片段


 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'],

     }

 }

  1. 部署项目。

  2. 登录环境 ( eb ssh environment_name)。

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

  4. 终于跑了python3 manage.py migrate

结论:

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


查看完整回答
反对 回复 2023-12-29
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

在系统中使用环境属性,例如。运行 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 的 Commands: 部分下。


查看完整回答
反对 回复 2023-12-29
?
12345678_0001

TA贡献1802条经验 获得超5个赞

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

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


查看完整回答
反对 回复 2023-12-29
  • 3 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信