Terraform CI/CD Staging Pipeline mit CircleCI

1st October 2022

Hi,

Terraform CI/CD Staging Pipelines, wobei das CD für Continuous Deployment steht, erlauben ein sicheres und kontinuierliches Entwickeln von Infrastruktur mit Terraform. Üblicherweise wird durch ein Commit im main Branch die Pipeline gestartet und die gewünschten Änderungen zuerst auf der DEV Stage ausgeführt. Durch ein manuelles Approval können dann die Änderungen auf die QA Stage und anschließend auf die PROD Stage mit der Pipeline ausgerollt werden.

Wie so eine Terraform CI/CD Staging Pipeline mit AWS als Cloud Provider aussehen kann, möchte ich hier gerne vorstellen.

Warum eine CI/CD Staging Pipeline?

Zusammen mit dem Kunden planen und entwickeln wir ein ein komplexes AWS Setup mit Hasura, RDS, ECS und vielen weiteren AWS Services. Dieses Setup soll unter anderem auch mit der existierenden Produktionsumgebung in Salesforce interagieren. Es ist also von größter Wichtigkeit neue Funktionalitäten auf einer DEV und QA Umgebung zu testen.

Diese Umgebungen DEV und QA, sollen sich dabei möglichst ähnlich zur PROD Umgebung verhalten. Darüber hinaus sollen Änderungen schnell auf die PROD Umgebung ausführbar sein mit möglichst wenig benötigten manuellen Schritten. Genau für diese Anforderungen eignet sich eine CI/CD Staging Pipeline.

Multi-Account Setup

Um eine CI/CD Staging Pipelines zu erstellen ist es best practice für jede stage wie DEV, QA oder PROD einen eigenen AWS Account zu verwenden. Das Pipeline Setup muss also in der Lage sein diese Accounts mit Terraform zu bootstrappen bzw. zu initialisieren und anschließend Änderungen auszurollen.

Für das Multi-Account Setup habe ich mir den Artikel Terraform AWS Multi-Account Setup zum Vorbild genommen bei dem mittels Config Files wie accounts/dev/backend.conf und accounts/dev/terraform.tfvars die jeweilige Stage konfiguriert wird. Super cool ist nun, dass damit die gleiche main.tf für alle Staging Umgebungen verwendet werden kann.

Zu oft sehe ich bei Kunden die mit Terraform arbeiten, dass für jede Staging Umgebung eigene TF Files erzeugt werden und Ressourcen hin und her kopiert werden. Das muss aufhören und der hier beschriebene Ansatz kann dabei helfen!

CircleCI Staging Pipeline

CircleCI ist eine continuous integration and continuous delivery Plattform für DevOps Funktionalitäten. Ähnlich wie auch auf anderen DevOps Plattformen wie Travis oder GitHub Actions wird eine Pipeline yaml Definition im Ordner .circleci mit den Namen config.yml angelegt. Sehr toll finde ich, dass CircleCI manuelle Approvals unterstützt und einfach integrierbar macht mit:

workflows:
  version: 2
  plan_approve_apply:
    jobs:
      - dev-plan-apply
      - dev-hold-apply:
          type: approval
          requires:
            - dev-plan-apply
     ...

Somit können die geplanten Infrastruktur-Änderungen erst begutachtet und dann durchgeführt werden. Den vollständigen Code seht ihr hier.

Ausblick

Als nächstes möchte ich CDKTF einführen damit die Infrastruktur mit TypeScript definiert werden kann. Ähnlich wie es für mich auch der Fall mit AWS CDK war, verspreche ich mir dadurch ein schnelleres Entwickeln mit Terraform. Der Typen-Support erlaubt mir fehlende Terraform Properties schon früh zu erkennen. Auch ist die Dokumentation von den Properties sehr angenehm und ich muss somit kaum noch in der Terraform Dokumentation nachsehen.

Danach bin ich auch schon sehr gespannt wie AWS Ressourcen wie Aurora, ECS, VPC und so weiter mit Terraform integriert werden. Das Ganze erweitert mein Set an Tools mit denen ich coole Sachen in AWS bauen kann.

Fazit

Eine CI/CD Staging Pipeline ist ein wichtiges Tool um verlässliche Infrastruktur in AWS zu bauen. Hier in diesem Artikel habe ich euch gezeigt wie ihr es mit Terraform in AWS machen könnt. Da ich noch ein Anfänger in Terraform bin, habe ich eventuell kleine Fehler gemacht. Wenn ihr Verbesserungsvorschläge habt oder einfache coole Projekte mit mir besprechen wollt, schreibt mir gerne an :)!

Ich liebe es an Open Source Projekte zu arbeiten. Vieles kannst du bereits frei nutzen auf github.com/mmuller88 . Wenn du meine dortige Arbeit sowie meine Blog Posts toll findest, denke doch bitte darüber nach, mich zu unterstützen und ein Patreon zu werden:

Buy me a Ko-Fi

Oder

Be my Patron

Share