如何通过 eb cli (django postgres) 迁移 AWS RDS 数据库?
Posted
技术标签:
【中文标题】如何通过 eb cli (django postgres) 迁移 AWS RDS 数据库?【英文标题】:How can I migrate AWS RDS database through eb cli (django postgres)? 【发布时间】:2021-05-24 17:47:51 【问题描述】:我有一个使用弹性 beanstalk CLI 部署的 django 项目。 我添加了一个 postgres 数据库(AWS RDS),连接正在运行。
我的数据库仍然是空的。如何在 eb shell 中运行迁移命令或“python manage.py createsuperuser”?
当我打开eb ssh <env>
并尝试ls
时,没有显示任何内容。使用cd ..
和ls
再次退回一个目录会显示ec2-user、healthd 和webapp。我没有进入这些文件夹的权限。是否可以在 eb ssh 中运行 python 命令?
我也尝试过容器命令,.ebextensions/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 部署 创建应用程序版本存档“app-xxxx”。 上传:[############################################## ###] 100% 完成...
2021-02-22 12:57:12 INFO 环境更新开始。
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(s) 'i-xxxx'。中止操作。
2021-02-22 12:58:24 错误无法部署应用程序。
错误:ServiceError - 无法部署应用程序。
为什么命令失败?任何建议表示赞赏。顺便说一句,我用本地 sql db 部署没有问题。
更新:
eb-engine.log 将我引向 cfn-init.log。这是输出:
2021-02-22 16:49:43,624 [错误] 命令 01_makemigrations (python manage.py makemigrations) 失败
2021-02-22 16:49:43,624 [错误] 在构建过程中遇到错误 postbuild_0_django_test:命令 01_makemigrations 失败
Traceback(最近一次调用最后一次):文件 “/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py”,行 542,在运行配置中 CloudFormationCarpenter(config, self._auth_config).build(worklog)
文件 “/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py”,行 260,正在构建中 更改['commands'] = CommandTool().apply(self._config.commands)
文件 “/usr/lib/python2.7/site-packages/cfnbootstrap/command_tool.py”,行 117、申请中 raise ToolError(u"Command %s failed" % name) ToolError: Command 01_makemigrations failed
在路径中我看到 python 2.7 (?) 但实际上 Python 3.7 运行在 64 位 Amazon Linux 2 上。我还尝试使用“python3”执行命令。
【问题讨论】:
this 回答你的问题了吗? 我完全使用本教程来设置所有内容。但是“添加数据库迁移配置文件”中提到的配置也不起作用。 您是否查看了输出中提到的eb-engine.log
?它应该会告诉你更多细节。
我会更新我的问题。
eb-engine.log 将我推荐给 cfn-init.log。将输出添加到问题中。
【参考方案1】:
问题是此时没有加载 django。
解决方案:
container_commands:
01_migrate:
command: |
source $PYTHONPATH/activate
pipenv run python ./manage.py migrate
将您引至eb-engine.log
和cfn-init.log
的日志,但我在cfn-init-cmd.log
中找到了最后的提示:
2021-02-23 11:08:34,019 P5022 [INFO] ImportError:无法导入 Django。您确定它已安装并在您的 PYTHONPATH 环境变量中可用吗?您忘记激活虚拟环境了吗?
我也尝试过“createsuperuser”。完全没有错误,也没有创建新用户。没有用于输入用户名/密码的活动命令行。如果我找到了 createsuperuser 的解决方案,我会尝试更新我的答案。
【讨论】:
【参考方案2】:我可以提出另一种方法:
您可以将本地 Django 项目的 DATABASE
settings 调整为远程数据库,而不是从 eb shell 中运行 Django 管理命令,并从本地终端执行管理命令。
这对于运行临时命令(例如 createsuperuser
)很有用,但对于日常维护命令(例如 migrate
),您需要在部署过程中坚持使用 container_commands
方法。
最后,如果您决定在 eb shell 中运行createsuperuser
,那么您可以使用container_commands
以非交互方式执行此操作,并配置一些额外的设置。来自Django Docs:
以交互方式运行时,此命令将提示输入新超级用户帐户的密码。当以非交互方式运行时,您可以通过设置 DJANGO_SUPERUSER_PASSWORD 环境变量来提供密码。否则,将不会设置密码,并且超级用户帐户将无法登录,直到手动为其设置密码。
在非交互模式下,USERNAME_FIELD 和必填字段(列在 REQUIRED_FIELDS 中)回退到 DJANGO_SUPERUSER_
环境变量,除非它们被命令行参数覆盖。例如,要提供电子邮件字段,您可以使用 DJANGO_SUPERUSER_EMAIL 环境变量。
【讨论】:
以上是关于如何通过 eb cli (django postgres) 迁移 AWS RDS 数据库?的主要内容,如果未能解决你的问题,请参考以下文章
aws elasticbeanstalk:无法通过 eb cli 部署到工作环境
如何使用 EB cli 查看我的 EB ec2 的 python 日志
Django,AWS EB 错误,您的 WSGIPath 引用了一个不存在的文件