Ich bin auch in der Lage, die vorhandene AWS-Infrastruktur auf Terraform zu migrieren. Daher werde ich versuchen, die Antwort während meiner Entwicklung zu aktualisieren.
Ich habe mich stark auf die offiziellen Terraform- Beispiele und das mehrfache Ausprobieren verlassen, um Bereiche zu konkretisieren, in denen ich unsicher war.
.tfstate
Dateien
Die Terraform-Konfiguration kann verwendet werden, um viele Boxen in unterschiedlichen Infrastrukturen bereitzustellen, von denen jede einen anderen Status haben kann. Da dieser Status auch von mehreren Personen ausgeführt werden kann, sollte er sich an einem zentralen Ort (wie S3) befinden, jedoch nicht an Git.
Dies kann anhand der Terraform bestätigt werden .gitignore
.
Entwicklersteuerung
Unser Ziel ist es, Entwicklern eine bessere Kontrolle über die Infrastruktur zu bieten und gleichzeitig ein vollständiges Audit (Git-Protokoll) und die Möglichkeit zur Überprüfung von Änderungen (Pull-Anforderungen) aufrechtzuerhalten. Vor diesem Hintergrund strebe ich einen neuen Infrastruktur-Workflow an:
- Basisgrundlage für gängige AMIs, die wiederverwendbare Module enthalten, z. B. Marionetten.
- Von DevOps mithilfe von Terraform bereitgestellte Kerninfrastruktur.
- Entwickler ändern die Terraform-Konfiguration in Git nach Bedarf (Anzahl der Instanzen; neue VPC; Hinzufügen einer Region / Verfügbarkeitszone usw.).
- Die Git-Konfiguration wurde gepusht und eine Pull-Anfrage wurde von einem Mitglied des DevOps-Teams auf ihre Richtigkeit überprüft.
- Wenn dies genehmigt wird, ruft Webhook zum Erstellen und Bereitstellen von CI auf (unsicher, wie mehrere Umgebungen zu diesem Zeitpunkt partitioniert werden sollen).
Bearbeiten 1 - Aktueller Status aktualisieren
Seit ich mit dieser Antwort angefangen habe, habe ich viel TF-Code geschrieben und fühle mich in unserem Zustand wohler. Wir haben auf dem Weg Fehler und Einschränkungen festgestellt, aber ich akzeptiere, dass dies ein Merkmal der Verwendung neuer, sich schnell ändernder Software ist.
Layout
Wir haben eine komplizierte AWS-Infrastruktur mit mehreren VPCs mit jeweils mehreren Subnetzen. Der Schlüssel zur einfachen Verwaltung bestand darin, eine flexible Taxonomie zu definieren, die Region, Umgebung, Service und Eigentümer umfasst und mit der wir unseren Infrastrukturcode (sowohl Terraform als auch Marionette) organisieren können.
Module
Der nächste Schritt bestand darin, ein einzelnes Git-Repository zum Speichern unserer Terraform-Module zu erstellen. Unsere oberste Verzeichnisstruktur für die Module sieht folgendermaßen aus:
tree -L 1 .
Ergebnis:
├── README.md
├── aws-asg
├── aws-ec2
├── aws-elb
├── aws-rds
├── aws-sg
├── aws-vpc
└── templates
Jeder legt einige vernünftige Standardeinstellungen fest, macht sie jedoch als Variablen verfügbar, die von unserem "Kleber" überschrieben werden können.
Kleben
Wir haben ein zweites Repository mit unserem glue
, das die oben genannten Module verwendet. Es ist in Übereinstimmung mit unserem Taxonomiedokument angelegt:
.
├── README.md
├── clientA
│ ├── eu-west-1
│ │ └── dev
│ └── us-east-1
│ └── dev
├── clientB
│ ├── eu-west-1
│ │ ├── dev
│ │ ├── ec2-keys.tf
│ │ ├── prod
│ │ └── terraform.tfstate
│ ├── iam.tf
│ ├── terraform.tfstate
│ └── terraform.tfstate.backup
└── clientC
├── eu-west-1
│ ├── aws.tf
│ ├── dev
│ ├── iam-roles.tf
│ ├── ec2-keys.tf
│ ├── prod
│ ├── stg
│ └── terraform.tfstate
└── iam.tf
Innerhalb der Client-Ebene verfügen wir über AWS-kontospezifische .tf
Dateien, die globale Ressourcen bereitstellen (z. B. IAM-Rollen). Als nächstes folgt die Regionsebene mit öffentlichen EC2-SSH-Schlüsseln. Schließlich in unserer Umgebung ( dev
, stg
, prod
usw.) sind unsere VPC - Setups, zB Erstellung und Peering - Verbindungen usw. gespeichert sind.
Randnotiz: Wie Sie sehen können, widerspreche ich meinem eigenen Rat, wenn ich mich terraform.tfstate
an Git halte. Dies ist eine vorübergehende Maßnahme, bis ich zu S3 wechsle, passt aber zu mir, da ich derzeit der einzige Entwickler bin.
Nächste Schritte
Dies ist immer noch ein manueller Prozess und noch nicht in Jenkins, aber wir portieren eine ziemlich große, komplizierte Infrastruktur und bisher so gut. Wie gesagt, ein paar Bugs, aber es läuft gut!
Bearbeiten 2 - Änderungen
Es ist fast ein Jahr her, seit ich diese erste Antwort geschrieben habe, und der Zustand von Terraform und mir hat sich erheblich verändert. Ich bin jetzt an einer neuen Position und verwende Terraform zum Verwalten eines Azure-Clusters. Terraform ist jetzt v0.10.7
.
Zustand
Die Leute haben mir wiederholt gesagt, dass der Staat nicht in Git gehen soll - und sie sind korrekt. Wir haben dies als Zwischenmaßnahme für ein Zwei-Personen-Team verwendet, das sich auf die Kommunikation und Disziplin der Entwickler stützte. Mit einem größeren, verteilten Team nutzen wir jetzt den Remote-Status in S3 vollständig mit Sperren, die von DynamoDB bereitgestellt werden. Im Idealfall wird dies auf Consul migriert, jetzt ist es Version 1.0, um Cloud-übergreifende Anbieter zu kürzen.
Module
Zuvor haben wir interne Module erstellt und verwendet. Dies ist immer noch der Fall, aber mit dem Aufkommen und Wachstum der Terraform-Registrierung versuchen wir, diese zumindest als Basis zu verwenden.
Dateistruktur
Die neue Position hat eine viel einfachere Taxonomie mit nur zwei Infx-Umgebungen - dev
und prod
. Jedes hat seine eigenen Variablen und Ausgänge, wobei unsere oben erstellten Module wiederverwendet werden. Der remote_state
Anbieter hilft auch beim Teilen von Ausgaben erstellter Ressourcen zwischen Umgebungen. In unserem Szenario handelt es sich um Subdomänen in verschiedenen Azure-Ressourcengruppen zu einer global verwalteten TLD.
├── main.tf
├── dev
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── prod
├── main.tf
├── output.tf
└── variables.tf
Planung
Mit den zusätzlichen Herausforderungen eines verteilten Teams speichern wir jetzt immer unsere Ausgabe des terraform plan
Befehls. Wir können überprüfen und wissen, was ausgeführt wird, ohne dass das Risiko von Änderungen zwischen der plan
und der apply
Bühne besteht (obwohl das Sperren dabei hilft). Denken Sie daran, diese Plandatei zu löschen, da sie möglicherweise "geheime" Variablen im Klartext enthalten kann.
Insgesamt sind wir sehr zufrieden mit Terraform und lernen und verbessern uns weiter mit den neuen Funktionen.