Ich mag den Ansatz einer App 12factor , in die Sie bei der Bereitstellung einer Anwendung für Heroku gezwungen werden. Für diese Frage bin ich besonders daran interessiert, Umgebungsvariablen für die Konfiguration zu setzen, wie man es bei Heroku machen würde.
Soweit ich das beurteilen kann, gibt es keine Möglichkeit, die ENV für eine oder mehrere Instanzen innerhalb der EC2-Konsole zu ändern (obwohl es möglich ist, 5 ENV vars zu setzen, wenn elastisches Bohnenranke verwendet wird). Daher wäre meine nächste Wette auf ein Ubuntu-basiertes System die Verwendung von /etc/environment
, /etc/profile
, ~/.profile
oder nur der export
-Befehl, um ENV-Variablen zu setzen.
Ist das der richtige Ansatz oder fehlt mir etwas?
Und wenn ja, gibt es eine Best Practice, wie es geht? Ich denke, ich könnte etwas wie Capistrano oder Fabric verwenden , holen Sie sich eine Liste der Server von der AWS API, verbinden Sie sich mit allen und ändern Sie die erwähnten Dateien / call export
. Obwohl 12factor ziemlich bekannt ist, konnte ich keinen Blogpost finden, der beschreibt, wie man mit der ENV für eine nicht-triviale Menge von Instanzen auf EC2 umgeht. Und ich möchte so etwas nicht umsetzen, wenn es jemand schon sehr gut gemacht hat und ich etwas verpasst habe.
Hinweis : Ich möchte eine Lösung ohne Verwendung von elastischem Bohnenranking und mir ist es egal, ob git push
oder andere Heroku-ähnliche Funktionen verwendet werden, dies bezieht sich ausschließlich auf die App-Konfiguration.
Irgendwelche Tipps geschätzt, danke!
Gute Frage. Es gibt viele Möglichkeiten, wie Sie die Einrichtung Ihrer Einrichtung / Umgebung angehen können.
Beachten Sie, dass Sie bei Heroku (oder Elastic Beanstalk) nur den Code drücken. Ihr Service kümmert sich um den Skalierbarkeitsfaktor und die Replikation Ihrer Dienste in der gesamten Infrastruktur (sobald Sie den Code drücken). Wenn Sie Fabric (oder Capistrano) verwenden, verwenden Sie auch ein Push-Modell, aber Sie müssen sich um die Skalierbarkeit / Replikation / Fehlertoleranz Ihrer Anwendung kümmern.
Nachdem Sie gesagt haben, dass Sie EC2 verwenden, ist es meiner Meinung nach besser, wenn Sie AMIs, Autoscale und Cloudformation für Ihre Bereitstellungen nutzen. Dies ist die Schönheit der Elastizität und Virtualisierung in dem Sie Ressourcen als ephemere betrachten können. Sie können weiterhin Fabric / Capistrano verwenden, um die AMI-Builds zu automatisieren (ich benutze Ansible) und Umgebungsvariablen, Pakete usw. zu konfigurieren. Dann können Sie einen Cloudformations-Stack (mit einer JSON-Datei) definieren und darin eine Autoscaling-Gruppe hinzufügen vorgebackenen AMI.
Eine weitere Möglichkeit zur Bereitstellung Ihrer App besteht darin, einfach den AWS Opsworks-Dienst zu verwenden. Es ist ziemlich umfangreich und es hat viele Optionen, aber es ist vielleicht nicht für jeden da einige Leute vielleicht ein bisschen mehr Flexibilität wollen.
Wenn Sie ein "Pull" -Modell verwenden möchten, können Sie Puppet, Chef oder CFEngine verwenden. In diesem Fall haben Sie einen Master-Richtlinienserver irgendwo in der Cloud (Puppetmaster, Chef Server oder Policy Server). Wenn ein Server hochfährt, stellt ein Agent (Puppet-Agent, Chef-Client, Cfengine-Agent) eine Verbindung mit seinem Master her, um seine Richtlinie zu übernehmen und führt sie dann aus. Die Richtlinie kann alle Pakete und Umgebungsvariablen enthalten, die Sie für die Funktion Ihrer Anwendung benötigen. Wieder ist es ein anderes Modell. Dieses Modell skaliert ziemlich gut, aber es hängt davon ab, wie viele Agenten der Master handhaben kann und wie Sie die Verbindungen von den Agenten zum Master staffeln. Sie können mehrere Master gleichzeitig laden, wenn Sie auf Tausende von Servern skalieren möchten, oder Sie können einfach mehrere Master verwenden. Aus Erfahrung, wenn Sie etwas wirklich "schnell" wollen, funktioniert Cfengine ziemlich gut, es gibt einen guten Blog, der die Geschwindigkeit von Puppet und CFengine hier vergleicht: Ссылка
Sie können auch komplett mit Werkzeugen wie Stoff, Ansible, Capistrano "drücken". Sie sind jedoch davon abhängig, wie sehr ein einzelner Server (oder Laptop) mehrere Verbindungen zu Tausenden von Servern bewältigen kann, an die er versucht, zu gelangen. Dies wird auch durch die Netzwerkbandbreite eingeschränkt, aber hey, du kannst kreativ werden und deine Push-Updates staffeln und vielleicht mehrere Server verwenden, um zu pushen. Wieder funktioniert es und es ist ein anderes Modell, also hängt es davon ab, in welche Richtung du gehen willst.
Hoffe, das hilft.
Wenn Sie keine Bohnenstange benötigen, können Sie sich AWS Opsworks ( Ссылка ) ansehen. Ideal für Web-Arbeiter Art der Bereitstellung von Szenarien. Sie können hier beliebige Variablen außerhalb des Codes übergeben (sogar Chef-Rezepte)
Es ist vielleicht zu spät, aber was wir tun.
Wir haben Python-Skripte, die env var in Json verwenden und diese als Post-Daten an ein anderes Python-Skript senden, das diese vars in ymal-Datei konvertiert.
Danach verwenden wir Jenkins pipline groovy mit Multibranch. Jenkins führt alle Build- und dann Code-Deploy-Kopien aus, die diese env vars in ec2 instanzed ausführen, die in Autoscaling ausgeführt werden. Natürlich machen wir einige Manipulationen von Yaml bis zu einfachen Textdateien, so dass Code Deploy es auf / etc / envoirments einfügen kann
Tags und Links configuration heroku amazon-web-services amazon-ec2 deployment