Ich stelle ein Django-Projekt mithilfe von Elastic Beanstalk in AWS bereit und hänge bei der Migration der Datenbank fest.
Wo ich bin: Ich kann mein django-Projekt erfolgreich bereitstellen und die Seite über mysubdomain.elasticbeanstalk.com laden. Die Seite wird ohne Fehler geladen, bis ich zu einer Seite komme, die einen Datenbankaufruf durchführen muss. Ich bekomme dann einen Fehler wie relation "accounts_user" does not exist LINE 1: SELECT COUNT(*) FROM "accounts_user"
, weil meine Datenbank nicht migriert wurde.
Was ich versucht habe: Ich habe schon einige Variationen ausprobiert. Glücklicherweise gibt es eine Fülle von Stackoverflow-Posts und ein paar Tutorials. Leider scheinen sie alle eine andere Version zu verwenden und was sie vorschlagen, trifft nicht auf mein Projekt zu.
Mir ist ziemlich klar, dass ich die Migration in einer foobar.config
-Datei im Ordner .ebextensions/
ausführen muss. Hier ist die Basis von dem, was ich tun möchte:
In den Protokollen sehe ich, dass das Post-Deployment-Skript versucht hat zu laufen, aber es ist fehlgeschlagen. Ich erhalte keine weiteren Informationen über den Fehler. Das einzige, was ich sehe, ist etwas wie "ERROR: 01_migrate post deployment script failed"
Ich finde heraus, dass ich die virtuelle Umgebung für den Befehl aktivieren muss, was sinnvoll ist. Von asdf versuche ich das:
%Vor%Aber es funktioniert nicht. In der Tat, durch SSH finde ich heraus, ich habe nicht einmal einen / opt / python / Ordner, nur / opt / aws / und / opt / elasticbeanstalk /. Alle Tutorials und SO Fragen beziehen sich auf diesen Ordner, aber ich habe es nicht?
VERSIONEN: Python 3.4.1, Django 1.7.7, AWS CLI 3.2.1, Postgres 9.3
Die container_commands werden NICHT innerhalb des Dockercontainers ausgeführt. Sie werden direkt auf der ec2-Instanz ausgeführt.
Derzeit verwende ich docker exec
, um die Migration durchzuführen. Da der betroffene Docker-Container afaik ist, habe ich den letzten gestartet, indem ich docker ps -a --no-trunc -q | head -n 1
verwende, um die Container-ID zu erhalten.
Am Ende sieht meine setup.config so aus
%Vor%Ich hoffe, dass das auch Ihr Problem löst.
Ich weiß, dass dies ein alter Post ist, aber ich möchte meine Antwort hier posten, da es ziemlich lange gedauert hat, bis ich herausgefunden habe.
Sebastian wies mich irgendwie in die richtige Richtung, aber das Problem bei diesem Ansatz ist, dass es vor der Bereitstellung ausgeführt wird (also migriert man den alten Code)
Sie können auch den Befehl files
in ebextensions verwenden und eine Datei in / opt / elasticbeanstalk / hooks / appdeploy / post schreiben, aber dies wird auf jeder Instanz ausgeführt
Sie können diese beiden Dinge kombinieren:
%Vor%Dadurch wird ein Post-Bereitstellungsskript im richtigen Verzeichnis und NUR auf dem Vorspann erstellt.
Das funktioniert wirklich gut für mich, aber sei gewarnt, die Hooks sind nicht dokumentierte Funktionen
Aktualisiere Informationen bezüglich der neuesten Version von Elastic Beanstalk.
Ich verwende 64bit Amazon Linux 2016.09 v2.3.3 running Python 3.4
.
Der folgende Befehl funktioniert für mich, ohne dass ich virtualenv
aktivieren oder einen Post-App-Deploy-Hook erstellen muss.
Um zu beweisen, dass container commands
in einer Post-Deploy-Phase ausgeführt wird, habe ich meine Modelle geändert, die aktualisierten Migrations-Scripts erstellt, die neue Version bereitgestellt und überprüft, ob die Datenbank erfolgreich migriert wurde: Erfolg !
Tags und Links django amazon-web-services elastic-beanstalk