如何通过 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-userhealthdwebapp。我没有进入这些文件夹的权限。是否可以在 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.logcfn-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 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 EB CLI 中更改用户?

aws elasticbeanstalk:无法通过 eb cli 部署到工作环境

如何使用 EB cli 查看我的 EB ec2 的 python 日志

Django,AWS EB 错误,您的 WSGIPath 引用了一个不存在的文件

Elastic Beanstalk CLI 错误:尚未使用 EB CLI 设置此目录 您必须先运行“eb init”

如何使用 EB CLI 在应用程序之间切换?