Implementieren von Konformitätstests mit Terraform und Azure

Mit Terraform können Sie eine Cloudinfrastruktur definieren, eine Vorschau der Cloudinfrastruktur anzeigen und die Cloudinfrastruktur bereitstellen. Terraform ermöglicht das Erstellen von Konfigurationsdateien mit HCL-Syntax. Mit der HCL-Syntax können Sie den Cloudanbieter (beispielsweise Azure) und die Elemente angeben, aus denen sich Ihre Cloudinfrastruktur zusammensetzt. Nach der Erstellung Ihrer Konfigurationsdateien erstellen Sie einen Ausführungsplan, mit dem Sie eine Vorschau Ihrer Infrastrukturänderungen anzeigen können, bevor diese bereitgestellt werden. Nach der Überprüfung der Änderungen wenden Sie den Ausführungsplan an, um die Infrastruktur bereitzustellen.

Häufig sind Konformitätstests Teil des Continuous Integration-Prozesses und werden verwendet, um sicherzustellen, dass benutzerdefinierte Richtlinien eingehalten werden. Möglicherweise definieren Sie geopolitische Namenskonventionen für Ihre Azure-Ressourcen, Ein weiteres gängiges Beispiel ist das Erstellen virtueller Computer auf der Grundlage einer definierten Teilmenge von Images. Konformitätstests werden verwendet, um Regeln in diesen und vielen anderen Szenarien zu erzwingen.

In diesem Artikel werden folgende Vorgehensweisen behandelt:

  • Grundlegendes zur Verwendung von Konformitätstests
  • Durchführen eines Konformitätstests
  • Anzeigen und Ausführen eines Beispielkonformitätstests

1. Konfigurieren Ihrer Umgebung

  • Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
  • Docker:Install Docker.

  • Python:Install Python.

  • Tool „terraform-compliance“: Installieren Sie das Tool „terraform-compliance“, indem Sie den folgenden Befehl ausführen: pip install terraform-compliance.

  • Beispielcode und Ressourcen: Laden Sie mithilfe des DownGit-Tools das Projekt „compliance-testing“ von GitHub herunter, und entpacken Sie es in einem neuen Verzeichnis, das den Beispielcode enthalten soll. Dieses Verzeichnis wird als Beispielverzeichnis bezeichnet.

2. Grundlegendes zu Konformitätstests und -prüfungen

Konformitätstests sind eine nicht funktionale Testmethode, mit der Sie feststellen können, ob ein System vorgeschriebenen Standards entspricht. Konformitätstests werden auch als Übereinstimmungstests bezeichnet.

Die meisten Softwareteams führen eine Analyse durch, um zu überprüfen, ob die Standards korrekt erzwungen und implementiert werden. Häufig versuchen sie dabei gleichzeitig, die Standards zu verbessern, wodurch wiederum die Qualität erhöht wird.

Bei Konformitätstests müssen zwei wichtige Konzepte berücksichtigt werden: Konformitätstests und Konformitätsprüfungen.

  • Konformitätstests stellen sicher, dass das Ergebnis jeder Phase des Entwicklungslebenszyklus den vereinbarten Anforderungen entspricht.
  • Konformitätsprüfungen sollten zu Beginn der Projekte in den Entwicklungszyklus integriert werden. Das Hinzufügen von Konformitätsprüfungen zu einem späteren Zeitpunkt wird zunehmend schwieriger, wenn die Anforderung selbst nicht ausreichend dokumentiert ist.

Das Durchführen von Konformitätsprüfungen ist unkompliziert. Für jede Phase des Entwicklungslebenszyklus wird eine Reihe von Standards und Prozeduren entwickelt und dokumentiert. Das Ergebnis der einzelnen Phasen wird mit den dokumentierten Anforderungen verglichen. Die Ergebnisse des Tests sind alle „Lücken“, die nicht den vordefinierten Standards entsprechen. Konformitätstests werden anhand des Überprüfungsprozesses durchgeführt, und das Ergebnis des Review-Prozesses sollte dokumentiert werden.

Sehen wir uns ein spezifisches Beispiel an.

Ein häufiges Problem sind Umgebungen, in denen es zu Unterbrechungen kommt, wenn mehrere Entwickler inkompatible Änderungen anwenden. Angenommen, eine Person arbeitet an einer Änderung und wendet Ressourcen an, z. B. durch Erstellen einer VM in einer Testumgebung. Eine weitere Person wendet dann eine andere Version des Codes an, durch die eine andere Version dieser VM bereitgestellt wird. In Fällen wie diesem ist eine Überwachung erforderlich, um die Konformität mit definierten Regeln sicherzustellen.

Eine Möglichkeit zur Lösung dieses Problems besteht darin, eine Richtlinie für das Taggen der Ressourcen zu definieren, z. B. mit den Tags role und creator. Nachdem Sie die Richtlinien definiert haben, stellen Sie mit einem Tool wie terraform-compliance sicher, dass sie befolgt werden.

Bei „terraform-compliance“ liegt der Schwerpunkt auf negativen Tests. Mit negativen Tests wird sichergestellt, dass ein System eine unerwartete Eingabe oder ein unerwünschtes Verhalten ordnungsgemäß behandeln kann. Fuzzing ist ein Beispiel für negative Tests. Mittels Fuzzing wird ein System getestet, das Eingaben empfängt, um sicherzustellen, dass es unerwartete Eingaben sicher verarbeiten kann.

Glücklicherweise ist Terraform eine Abstraktionsebene für beliebige APIs, die Cloudinfrastrukturentitäten erstellen, aktualisieren oder zerstören. Terraform stellt außerdem sicher, dass die lokale Konfiguration und die Remote-API-Antworten synchron sind. Da Terraform hauptsächlich gegen Cloud-APIs verwendet wird, benötigen wir immer noch eine Möglichkeit, um sicherzustellen, dass der für die Infrastruktur bereitgestellte Code bestimmte Richtlinien befolgt. Das kostenloses Open-Source-Tool „terraform-compliance“ bietet diese Funktionalität für Terraform-Konfigurationen.

Bei Verwendung des VM-Beispiels kann eine Compliancerichtlinie wie folgt aussehen: "Wenn Sie eine Azure-Ressource erstellen, muss sie ein Tag enthalten".

Das Tool „terraform-compliance“ stellt ein Testframework bereit, in dem Sie Richtlinien wie das obige Beispiel erstellen. Anschließend führen Sie die Richtlinien für den Terraform-Ausführungsplan aus.

Mit „terraform-compliance“ können Sie Prinzipien der verhaltensgesteuerten Entwicklung (Behavior-Driven Development, BDD) anwenden. BDD ist ein kollaborativer Prozess, bei dem alle Beteiligten zusammenarbeiten, um das gewünschte Verhalten eines Systems zu definieren. Zu den Beteiligten zählen in der Regel die Entwickler und Tester sowie alle Benutzer, die ein besonderes Interesse am entwickelten System haben oder von diesem betroffen sind. BDD soll Teams dazu ermutigen, konkrete Beispiele zu entwickeln, die ein gemeinsames Verständnis des gewünschten Verhaltens des Systems darstellen.

3. Untersuchen eines Konformitätstestbeispiels

Weiter oben in diesem Artikel wurde als Beispiel für einen Konformitätstest die Erstellung einer VM für eine Testumgebung genannt. In diesem Abschnitt erfahren Sie, wie sich dieses Beispiel in ein BDD-Feature und -Szenario übersetzen lässt. Die Regel wird zunächst mithilfe von Cucumber formuliert, einem Tool, das zur Unterstützung von BDD verwendet wird.

when creating Azure resources, every new resource should have a tag

Die vorherige Regel wird wie folgt übersetzt:

If the resource supports tags
Then it must contain a tag
And its value must not be null

Der Terraform-HCL-Code würde die Regel dann wie folgt einhalten.

resource "random_uuid" "uuid" {}

resource "azurerm_resource_group" "rg" {
  name     = "rg-hello-tf-${random_uuid.uuid.result}"
  location = var.location

  tags = {
    environment = "dev"
    application = "Azure Compliance"
  } 
}

Die erste Richtlinie könnte wie folgt als BDD-Featureszenario geschrieben werden:

Feature: Test tagging compliance  # /target/src/features/tagging.feature
    Scenario: Ensure all resources have tags
        If the resource supports tags
        Then it must contain a tag
        And its value must not be null

Der folgende Code zeigt einen Test für ein bestimmtes Tag:

Scenario Outline: Ensure that specific tags are defined
    If the resource supports tags
    Then it must contain a tag <tags>
    And its value must match the "<value>" regex

    Examples:
      | tags        | value              |
      | Creator     | .+                 |
      | Application | .+                 |
      | Role        | .+                 |
      | Environment | ^(prod\|uat\|dev)$ |

4. Ausführen des Konformitätstestbeispiels

In diesem Abschnitt laden Sie das Beispiel herunter und testen es.

  1. Navigieren Sie im Beispielverzeichnis zum Verzeichnis src.

  2. Führen Sie terraform init aus, um das Arbeitsverzeichnis zu initialisieren.

    terraform init
    
  3. Führen Sie terraform validate aus, um die Syntax der Konfigurationsdateien zu überprüfen.

    terraform validate
    

    Die wichtigsten Punkte:

    • Eine Meldung mit dem Hinweis wird angezeigt, dass die Terraform-Konfiguration gültig ist.
  4. Führen Sie terraform plan aus, um einen Ausführungsplan zu erstellen.

    terraform plan -out main.tfplan
    
  5. Führen Sie terraform show aus, um den Ausführungsplan für den Konformitätsschritt in JSON zu konvertieren.

    terraform show -json main.tfplan > main.tfplan.json
    
  6. Führen Sie docker pull aus, um das terraform-compliance-Image herunterzuladen.

    docker pull eerkunt/terraform-compliance
    
  7. Führen Sie docker run aus, um die Tests in einem Docker-Container auszuführen.

    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
    

    Die wichtigsten Punkte:

    • Die erste Regel, die das Vorhandensein von Tags erfordert, war zwar erfolgreich, bei der zweiten Regel tritt aber ein Fehler auf, weil die Tags Role und Creator fehlen. Daher ist der Test nicht erfolgreich.

    Example of a failed test

  8. Beheben Sie den Fehler, indem Sie main.tf wie folgt ändern (Tags Role und Creator werden hinzugefügt):

      tags = {
        Environment = "dev"
        Application = "Azure Compliance"
        Creator     = "Azure Compliance"
        Role        = "Azure Compliance"
      } 
    
    

    Die wichtigsten Punkte:

    • Die Konfiguration ist jetzt mit der Richtlinie konform.

5. Überprüfen der Ergebnisse

  1. Führen Sie terraform validate erneut aus, um die Syntax zu überprüfen.

    terraform validate
    
  2. Führen Sie terraform plan erneut aus, um einen neuen Ausführungsplan zu erstellen.

    terraform plan -out main.tfplan
    
  3. Führen Sie terraform show aus, um den Ausführungsplan für den Konformitätsschritt in JSON zu konvertieren.

    terraform show -json main.tfplan > main.tfplan.json
    
  4. Führen Sie docker run erneut aus, um die Konfiguration zu testen. Wurde die vollständige Spezifikation implementiert, ist der Test erfolgreich.

    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
    

    Example of a successful test

  5. Führen Sie zum Anwenden des Ausführungsplans den Befehl terraform apply aus.

    terraform apply main.tfplan -target=random_uuid.uuid
    

    Die wichtigsten Punkte:

    • Eine Ressourcengruppe mit einem Namen nach folgendem Muster wird erstellt: rg-hello-tf-<random_number>.

Problembehandlung für Terraform in Azure

Behandeln allgemeiner Probleme bei der Verwendung von Terraform in Azure

Nächste Schritte