在部署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'],
}
}
# [...]
我是否需要进行任何更改以使这些属性在部署时可用?
答案 0 :(得分:0)
似乎这是一个严重的错误,AWS对此并不在乎。我想出了几种方法来完成这项工作,但所有这些方法都需要登录EB环境并进行一些手动工作。
根据hephalump的评论建议
创建一个AWS秘密管理器
在EB的环境IAM instance profile
中检查Configuration->Security->Edit
。
然后转到IAM用户控制台并转到Roles
。从那里,您可以将策略附加到Secret Manager的实例配置文件中。
完成后,部署项目
然后登录到环境(eb ssh environment_name
)。
转到/var/app/current/
目录并运行以下命令:source /var/app/venv/*/bin/activate
。
最后运行python3 manage.py migrate
。
编辑.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
运行source ~/.bash_profile
现在您可以部署项目了。
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'],
}
}
部署项目。
登录到环境(eb ssh environment_name
)。
转到/var/app/current/
目录并运行以下命令:source /var/app/venv/*/bin/activate
。
最后运行python3 manage.py migrate
。
解决方案1 几乎没有复杂,而秘密管理者则不是免费(仅限30天试用期)。
解决方案2 是最简单的之一,但我不推荐在EB上手动调整任何文件。
解决方案3 是我将使用的干净解决方案。此解决方案还将在将来解决此错误。
答案 1 :(得分:0)
在系统中使用环境属性,例如。运行 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 登录时,它们将全部设置好。当然,最好在commands: section 下的.ebextensions/*.config 中添加这个。