Django AWS Elastic Beanstalk迁移数据库

时间:2015-04-09 13:39:03

标签: django amazon-web-services elastic-beanstalk

我正在使用Elastic Beanstalk将Django项目部署到AWS,但我仍然无法迁移数据库。

我在哪里:我能够成功部署我的django项目并通过mysubdomain.elasticbeanstalk.com加载页面。页面加载没有错误,直到我到达需要进行数据库调用的页面。然后我收到类似relation "accounts_user" does not exist LINE 1: SELECT COUNT(*) FROM "accounts_user"的错误,因为我的数据库尚未迁移。

我尝试了什么:我尝试了很多不同的事情。幸运的是,有大量的stackoverflow帖子和几个教程。不幸的是,他们似乎都在使用不同的版本,他们的建议并不适用于我的项目。

我很清楚我需要在foobar.config文件夹内的.ebextensions/文件中运行迁移。这是我想要做的基础:

container_commands:
  01_migrate:
    command: "python manage.py migrate --noinput"
    leader_only: true

在日志中,我看到部署后脚本尝试运行但失败了。我没有收到有关错误的任何其他信息,我唯一看到的是"错误:01_migrate部署后脚本失败"

我发现我需要激活命令的虚拟环境,这是有道理的。从asdf我试试这个:

container_commands:
  01_migrate:
    command: "source /opt/python/run/venv/bin/activate && python rlg/manage.py migrate --noinput"
    leader_only: true

但它不起作用。事实上,通过SSH我发现我甚至没有/ opt / python /文件夹,只有/ opt / aws /和/ opt / elasticbeanstalk /。所有教程和SO问题都引用了这个文件夹,但我没有?

版本: Python 3.4.1,Django 1.7.7,AWS CLI 3.2.1,Postgres 9.3

3 个答案:

答案 0 :(得分:12)

我知道这是一篇很老的帖子,但我想在这里发布我的答案,因为我花了很长时间才弄明白。

塞巴斯蒂安向我指出了正确的方向,但这种方法的问题是它在部署之前运行(所以你迁移旧代码)

您还可以在ebextensions中使用files命令并将文件写入/ opt / elasticbeanstalk / hooks / appdeploy / post,但这将在任何实例上运行

您可以将这两件事合并到:

container_commands:
  01migrate:
    command: "mkdir -p /opt/elasticbeanstalk/hooks/appdeploy/post/ && echo -e '#!/bin/bash\ndocker exec `docker ps -a -q | head -n 1` python <path_to_code> migrate' > /opt/elasticbeanstalk/hooks/appdeploy/post/99_migrate.sh && chmod +x /opt/elasticbeanstalk/hooks/appdeploy/post/99_migrate.sh"
    leader_only: true

这将在正确的dir中创建一个post deploy脚本,并且只在leader上创建。

这对我来说真的很好但是要注意,钩子目录是未记录的功能

答案 1 :(得分:9)

container_commands不在docker容器中执行。它们直接在ec2实例上执行。 目前我正在使用docker exec进行迁移。由于有关的docker容器是afaik,最后一个开始,我使用docker ps -a --no-trunc -q | head -n 1来获取容器ID。

最后,我的setup.config看起来像那个

container_commands:
  01syncdb:
    command: "docker exec `docker ps -a --no-trunc -q | head -n 1` /var/app/bin/python /var/app/manage.py syncdb --noinput  &>> /tmp/deploy.log"
    leader_only: true
  02migrate:
    command: "docker exec `docker ps -a --no-trunc -q | head -n 1` /var/app/bin/python /var/app/manage.py migrate --noinput  &>> /tmp/deploy.log"
    leader_only: true

我希望这也能解决你的问题。

答案 2 :(得分:-3)

更新有关最新Elastic Beanstalk版本的信息。

我正在使用64bit Amazon Linux 2016.09 v2.3.3 running Python 3.4

以下命令对我有用,无需激活virtualenv或创建post app deploy hook。

container_commands:
  01_migrate_db:
    command: "python manage.py db upgrade" <-- insert your migration command here
    leader_only: true

为了证明container commands将在部署后阶段执行,我对模型进行了更改,生成了更新的迁移脚本,部署了新版本并检查数据库是否已成功迁移:成功!