Was ist in AWS AMI zu erstellen und was wird mit cloud-init bereitgestellt?

8

Ich verwende AWS Cloudformation, um zahlreiche Elemente der Netzwerkinfrastruktur (VPCs, Sicherheitsgruppen, Subnetze, Autoscaling-Gruppen usw.) für meine Webanwendung einzurichten. Ich möchte, dass der gesamte Prozess automatisiert wird. Ich möchte auf einen Knopf klicken und in der Lage sein, das Ganze zu feuern.

Ich habe erfolgreich eine Cloudformationsvorlage erstellt, die all diese Netzwerkinfrastruktur aufbaut. Die EC2-Instanzen werden derzeit jedoch ohne erforderliche Software gestartet. Jetzt versuche ich herauszufinden, wie man diese Software am besten bekommt.

Dafür erstelle ich AMIs mithilfe von Packer.io . Aber einige Leute haben mich stattdessen dazu gedrängt, Cloud-Init zu verwenden. Welche Heuristik sollte ich verwenden, um zu entscheiden, was in den AMIs gebrannt wird und was ich über Cloud-Init konfigurieren soll?

Ich möchte zum Beispiel eine EC2-Instanz vorkonfigurieren, damit ich ( saqib ) mich ohne ein Passwort von meinem eigenen Laptop aus anmelden kann. Daher muss der EC2 einen Benutzer haben. Dieser Benutzer muss ein Home-Verzeichnis haben. Und in diesem Home-Verzeichnis muss eine Datei .ssh/known_hosts enthalten sein, die verschlüsselte Codes enthält. Soll ich diese Verzeichnisse in den AMI brennen? Oder sollte ich cloud-init verwenden, um sie einzurichten? Und wie soll ich mich in diesem und anderen ähnlichen Fällen entscheiden?

    
Saqib Ali 03.03.2015, 05:16
quelle

2 Antworten

13

Ich möchte die Maschinenbereitstellung von der Bereitstellung der Umgebung trennen.

Im Allgemeinen verwende ich Folgendes als Leitfaden:

Erstellungsphase

  • Erstellen Sie ein Basismaschinen-Image mit etwas wie Packer, einschließlich aller für die Ausführung Ihrer Anwendung erforderlichen Software. Erstelle daraus ein AMI.
  • Installieren Sie die Anwendung (en) auf dem Basismaschinenimage, um ein Anwendungsabbild zu erstellen. Kennzeichnen und versionieren Sie dieses Artefakt. Binden Sie hier keine umweltspezifischen Elemente wie Datenbankverbindungen usw. ein, da dies die einfache Wiederverwendung dieses AMI über verschiedene Umgebungslaufzeiten ausschließt.
  • Stellen Sie sicher, dass alle Dienste gestoppt sind

Release-Phase

  • Erstellen Sie eine Umgebung, die aus Bildern und Infra besteht, und verwenden Sie dabei etwas wie CFN.
  • Verwenden Sie Cloud-Init user-data to konfigurieren Sie die Anwendungsumgebung (Datenbankverbindungen, Log Forwarder usw.) und starten Sie dann start die Anwendungen / Dienste

Dieser Ansatz bietet die größte Flexibilität und trennt die verschiedenen Belange einer Pipeline für die kontinuierliche Lieferung klar voneinander ab.

    
Matthew Fellows 29.03.2015, 23:21
quelle
4

Einer der wichtigen Faktoren, die bestimmen, wie Sie Server, AMIs und die Infrastrukturplanung zusammenstellen sollten, ist die Beantwortung der Frage: Wie schnell muss ich in der Produktion eine neue Instanz starten?

Die Antwort auf diese Frage bestimmt, wie viel Sie in das AMI einheizen und wie viel Sie nach dem Booten aufbauen.

HINWEIS: Meine Erfahrung ist mit Chef Server, daher werde ich Chef-Terminologie verwenden, aber die Konzepte sind für jeden anderen Konfigurationsverwaltungs-Stack identisch.

Die allgemeine Faustregel lautet, Ihre "Infrastruktur als Code" zu behandeln. Dies bedeutet, dass Sie den Prozess des Startens von Instanzen, des Erstellens von Benutzern auf diesem Computer und des Prozesses zum Verwalten von known_hosts-Dateien und SSH-Schlüsseln genau so betrachten müssen wie Ihren Anwendungscode. Die Möglichkeit, die Änderungen an Infrastructure im Quellcode zu verfolgen, erleichtert die Verwaltung, die Neueinrichtung und sogar CI erheblich.

Diese Einführung in den Küchenchef deckt die Terminologie in Kochbüchern, Rezepturen, Ressourcen und mehr ab. Es zeigt Ihnen, wie Sie einen einfachen LAMP-Stack erstellen und wie Sie ihn einfach mit einem Befehl neu starten können.

Wenn ich das Beispiel in Ihrer Frage anführe, würde ich auf einer hohen Ebene Folgendes tun:

  • Starten Sie eine Basis Ubuntu Linux AMI (derzeit 14.04) mit einem Cloudformation-Skript.
  • Im Abschnitt UserData der Instance-Konfiguration führen Sie einen Boot-Vorgang für den Chef-Client-Installationsprozess durch.
  • Führen Sie ein Rezept aus, um einen Benutzer zu erstellen.
  • Führen Sie ein Rezept aus, um die Datei known_hosts für den Benutzer
  • zu erstellen

Tools wie Chef werden verwendet, da Sie die Infrastruktur in kleine Code-Blöcke unterteilen können, die bestimmte Funktionen ausführen. Es gibt zahlreiche bereits gebaute und verfügbare Kochbücher, die die Grundbausteine ​​zum Erstellen von Diensten, Installieren von Softwarepaketen, etc. ausführen.

Alles in allem gibt es Zeiten, in denen Sie im Interesse Ihrer spezifischen Domäne und Anforderungen von den besten Praktiken abweichen müssen. Es kann Situationen geben, in denen Sie alle Vorteile eines Infrastrukturmanagements nutzen müssen, um Elemente in das AMI zu brennen.

Lassen Sie uns so tun, als ob Ihre Anwendung Bildverarbeitung durchführt und ImageMagick verwenden muss. Angenommen, Sie müssen ImageMagick aus der Quelle erstellen. Wenn Sie dies über Chefrezepte tun, könnte dies noch weitere 7 Minuten dazu führen, dass ImageMagick nur zur normalen Startzeit der Instanz kompiliert wird. Wenn das Warten auf 10 bis 12 Minuten zu lange dauert, damit eine neue Instanz online gehen kann, sollten Sie in Erwägung ziehen, ein eigenes AMI zu erstellen, auf dem ImageMagick bereits kompiliert und installiert wurde.

Dies ist eine akzeptable Lösung, aber Sie sollten bedenken, dass die Verwaltung Ihrer eigenen Flotte von vorgebackenen AMIs zusätzlichen Infrastrukturaufwand verursacht. Sie müssen Ihre benutzerdefinierten AMIs auf dem neuesten Stand halten, wenn neue AMIs veröffentlicht werden. Sie können dann auf verschiedene Instanztypen und auf verschiedene AWS-Regionen erweitern.

    
Mikelax 21.03.2015 14:26
quelle