如何通过eb cli(django-postgres)迁移AWS RDS数据库



我有一个django项目,部署了弹性beanstallCLI。我添加了一个postgres数据库(AWS RDS),连接正在运行。

我的数据库仍然是空的。如何运行迁移命令或";python manage.py createsuperuser"eb外壳内部?

当我打开eb ssh <env>并尝试ls时,不会显示任何内容。用cd ..ls返回一个目录会显示ec2用户healthdwebapp。我没有权限进入这些文件夹。在eb-ssh中运行python命令是可能的吗?

我也尝试过容器命令.eextensions/db-migrate.config:

container_commands:
01_makemigrations:
command: "python manage.py makemigrations"
leader_only: true
02_migrate:
command: "python manage.py migrate --first main initial && python manage.py migrate"
leader_only: true
option_settings:
aws:elasticbeanstalk:application:environment:
DJANGO_SETTINGS_MODULE: <app>.settings

在使用eb deploy再次提交并部署后,我得到了以下错误:

eb部署创建应用程序版本档案";应用xxxx";。上传:[##################################]100%完成。。。

2021-02-22 12:57:12信息环境更新正在启动。

2021-02-22 12:58:05信息将新版本部署到实例。

2021-02-22 12:58:21 INFO实例部署成功生成了"Procfile"。

2021-02-22 12:58:23错误实例部署失败。对于详细信息,请参阅"eb engine.log"。

2021-02-22 12:58:24错误[实例:i-xxxx]命令在上失败例子返回代码:1输出:引擎执行遇到错误

2021-02-22 12:58:24 INFO命令执行完成实例。摘要:[成功:0,失败:1]。

2021-02-22 12:58:24错误在上执行命令失败实例id"i-xxxx"。正在中止操作。

2021-02-22 12:58:24错误无法部署应用程序。

错误:ServiceError-无法部署应用程序。

为什么命令失败?欢迎提出任何建议。顺便说一句,我对使用本地sqldb进行部署没有任何问题。

更新:

ebengine.log将我引用到cfn-init.log。这是输出:

2021-02-22 16:49:43624[ERROR]命令01_makemigrations(pythonmanage.py makemigrations)失败的

2021-02-22 16:49:43624[错误]在的生成过程中遇到错误postbuild_0_django_test:命令01_makemigrations失败

Traceback(最近一次通话):文件"/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py";,线542,在run_config中CloudFormationCarpenter(配置,self._auth_config).build(工作日志)

文件"/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py";,线260,在建changes['commands']=CommandTool().apply(self._config.commands)

文件"/usr/lib/python2.7/site packages/cfnbootstrap/command_tool.py";,线117,适用引发工具错误(u"命令%s失败"%name)工具错误:命令01_makemigrations失败

在路径中,我看到了python 2.7(?),但实际上python 3.7正在64位Amazon Linux 2上运行。我还试着用";蟒蛇3";。

问题是当时没有加载django。

解决方案:

container_commands:
01_migrate:
command: |
source $PYTHONPATH/activate
pipenv run python ./manage.py migrate

向您介绍eb-engine.logcfn-init.log的日志,但我在cfn-init-cmd.log:中找到了最后一个提示

2021-02-23 11:08:34019 P5022[信息]导入错误:无法导入Django。您确定PYTHONPATH环境变量中已安装并可用它吗?你忘记激活虚拟环境了吗?

我也尝试过;createsuperuser";。没有任何错误,但也没有创建新用户。没有用于输入用户名/密码的活动命令行。如果我找到了createsuperuser的解决方案,我会尝试更新我的答案。

我可以提出另一种方法:

您可以将本地Django项目的DATABASE设置调整为远程数据库,并从本地终端执行管理命令,而不是在eb shell中运行Django管理命令。

这对于特别运行命令(如createsuperuser)非常有用,但对于常规维护命令(如migrate),您需要将container_commands方法作为部署过程的一部分。

最后,如果您决定运行createsuperuser,特别是在eb shell中,那么您可以使用container_commands进行非交互操作,并配置一些其他设置。来自Django文档:

交互运行时,此命令将提示输入新超级用户帐户的密码。非交互式运行时,可以通过设置DJANGO_SUPERUSER_password环境变量来提供密码。否则,将不设置密码,并且超级用户帐户在手动设置密码之前将无法登录。

在非交互模式下,USERNAME_FIELD和必填字段(在required_fields中列出)会回退到DJANGO_SUPERUSER_<uppercase_field_name>环境变量,除非它们被命令行参数覆盖。例如,要提供电子邮件字段,可以使用DJANGO_SUPERUSER_email环境变量。