Bei der Arbeit mit Terraform und der Bereitstellung von Cloud-Ressourcen über Infrastructure as Code kann schnell der Überblick über die Kosten verloren gehen. Besonders unter Zeitdruck kann es zu einer großen Herausforderung werden, die Kosten und Kostenänderungen im Blick zu behalten. An dieser Stelle setzt das Tool Infracost an und automatisiert die Kostenübersicht in Terraform-Projekten.
Funktionsumfang von Infracost
Die Grundlage von Infracost bildet die Cloud Pricing API, in welcher die Preise der Cloud-Provider hinterlegt sind und regelmäßig aktualisiert werden. Der Zugriff auf die API erfolgt in der Regel über das CLI infracost
. Die wichtigsten CLI-Befehle sind infracost breakdown
und infracost diff
.
Mit „breakdown“ wird die Terraform-Konfiguration nach verwalteten Ressourcen durchsucht und daraus eine Kostenprognose erzeugt, die entweder auf der Konsole ausgegeben oder in einer Datei abgespeichert werden kann. Infracost ignoriert dabei Ressourcen aus nicht verwendeten Modulen. Zusätzliche Konfigurationen erlauben auch die Berechnung der Kosten von Ressourcen, welche nach Nutzung abgerechnet werden. Der „diff“ Befehl wiederum kann die aktuelle Konfiguration mit einer vorher gespeicherten Konfiguration vergleichen und so die Auswirkung der Änderungen auf die Kosten darstellen.
Diese Berechnungen können ebenfalls in Pull Requests z. B. im Github als Kommentar gepostet werden. Dazu benötigt Infracost entsprechende Berechtigungen und vergleicht dann die beiden Branches auf Kostenänderungen.
Zusätzlich bietet Infracost die Möglichkeit, den Kostenverlauf in der Infracost Cloud nachzuverfolgen, allerdings ist dieser Dienst nach einer Testphase kostenpflichtig.
Vorteile von Infracost
Der Hauptvorteil von Infracost liegt auf der Hand: Die Kosten von Terraform-Ressourcen können automatisiert ermittelt und Änderungen im Hinblick auf die Kosten analysiert und dargestellt werden. Infracost unterstützt dabei eine Großzahl an Ressourcen in AWS, Microsoft Azure und der Google Cloud Platform. Es wird kein terraform plan
Befehl ausgeführt, sondern der Quellcode wird direkt ausgelesen, wodurch Infracost sehr schnell arbeitet.
Ein weiterer Vorteil liegt in der guten Integration in diverse CI/CD-Pipelines, darunter Github, Gitlab und Azure DevOps. Zusätzlich gibt es eine JSON-API, eine VSCode Erweiterung, eine Anbindung an Slack und einige weitere Integrationen. Damit kann Infracost vielseitig in bestehenden Arbeitsumfeldern eingesetzt werden.
Möchte ein Unternehmen aus Sicherheitsgründen nicht auf die öffentliche Cloud Pricing API zugreifen, bietet Infracost die Möglichkeit, die Schnittstelle selbst zu betreiben. Dabei werden die aktuellen Preise wöchentlich in eine eigene Instanz geladen, welche von den Clients verwendet werden kann.
Infracost in einem Beispiel
In einem kleinen Demo-Projekt sollen die Möglichkeiten von Infracost einmal verdeutlicht werden. Dazu habe ich eine Terraform-Konfiguration mit einer einzigen Ressource erstellt. Eine PostgreSQL-Datenbank soll in der Google Cloud Platform bereitgestellt werden, wobei zunächst 20 GB benötigter Speicher angegeben werden. Mit der CLI von Infracost ergibt sich so folgende Kostenübersicht:
In der Übersicht sind die Gesamtkosten von 20,42 € bei einer durchgehenden Nutzung von 730h / Monat aufgeschlüsselt. Im nächsten Schritt soll dieser Stand in einer Datei festgehalten und daraufhin mit einer aktualisierten Konfiguration verglichen werden. Dafür habe ich zunächst die Ausgabe von infracost breakdown
in eine JSON-Datei schreiben lassen und den Speicher der Datenbank in der Konfiguration auf 200 GB erhöht.
Der Befehl infracost diff
kann nun den Unterschied zwischen den beiden Ständen erkennen und zeigt eine Kostensteigerung von 178 %. So weit, so gut, allerdings ist diese manuelle Ausführung im Alltag recht unpraktisch und kann schnell vergessen werden. Daher lässt sich Infracost in gängige CI/CD-Pipelines einbinden, z.B. in Form von Kommentaren bei Pull Requests, die mögliche Kostenänderungen aufzeigen.
Dazu habe ich die Befehle in einen Github Actions Workflow geschrieben und anschließend um einen weiteren Befehl infracost comment
ergänzt, der die Ergebnisse des „diff“-Befehls in einen Kommentar im jeweiligen Pull Request schreibt.
Fazit
Mit Infracost kann sehr einfach und automatisiert eine Übersicht über die voraussichtlichen Kosten von Cloud-Ressourcen erstellt werden. Besonders die Integration in Pipelines kann helfen, ungeplante Kosten zu vermeiden, bevor Änderungen umgesetzt werden. Ebenfalls positiv ist die Möglichkeit, die Lösung selbst zu betreiben, und damit unabhängiger zu werden. Solange unterstützte Ressourcen verwendet werden, ist Infracost eine sehr hilfreiche Ergänzung in Terraform-Projekten.
Weitere Informationen und das Demo-Projekt können unter folgenden Links gefunden werden:
Infracost: Cloud cost estimates for Terraform in pull requests | Infracost
Demo-Projekt: tobiasmueckl/infracost-test: Demo project to test Infracost (github.com)
Seminarempfehlung
CLOUD COMPUTING ESSENTIALS CLOUD-COMP
Zum Seminar