Infrastructure-as-Code

Tipp

Diese Inhalte sind ein Auszug aus dem E-Book „Architecting Cloud Native .NET Applications for Azure“, verfügbar in der .NET-Dokumentation oder als kostenlos herunterladbare PDF-Datei, die offline gelesen werden kann.

Cloud Native .NET apps for Azure eBook cover thumbnail.

Cloudnative Systeme umfassen Microservices, Container und modernes Systemdesign, um Geschwindigkeit und Flexibilität zu erzielen. Sie bieten automatisierte Erstellungs- und Releasestufen, um konsistenten und hochwertigen Code zu gewährleisten. Aber das ist nur ein Teil der Geschichte. Wie stellen Sie die Cloudumgebungen bereit, auf denen diese Systeme ausgeführt werden?

Moderne cloudnative Anwendungen basieren auf der weithin akzeptierten Praxis von Infrastructure-as-Code oder IaC. Mit IaC automatisieren Sie die Plattformbereitstellung. Sie wenden im Wesentlichen Praktiken der Softwareentwicklung wie Testen und Versionsverwaltung auf Ihre DevOps-Methoden an. Ihre Infrastruktur und Bereitstellungen sind automatisiert, konsistent und wiederholbar. Genauso wie die kontinuierliche Bereitstellung das traditionelle Modell der manuellen Bereitstellung automatisiert hat, verändert Infrastructure-as-Code (IaC) die Art und Weise, wie Anwendungsumgebungen verwaltet werden.

Tools wie Azure Resource Manager (ARM), Terraform und die Azure-Befehlszeilenschnittstelle (CLI) ermöglichen es Ihnen, ein deklaratives Skript für die von Ihnen benötigte Cloudinfrastruktur zu verwenden.

Azure-Ressourcen-Manager-Vorlagen

ARM steht für Azure Resource Manager. Es handelt sich um ein API-Bereitstellungsmodul, das in Azure integriert und als API-Dienst verfügbar gemacht wird. Mit ARM können Sie die in einer Azure-Ressourcengruppe enthaltenen Ressourcen in einem einzelnen, koordinierten Vorgang bereitstellen, aktualisieren, löschen und verwalten. Sie stellen dem Modul eine JSON-basierte Vorlage zur Verfügung, in der die von Ihnen benötigten Ressourcen und deren Konfiguration angegeben sind. ARM orchestriert die Bereitstellung automatisch in der richtigen Reihenfolge unter Berücksichtigung der Abhängigkeiten. Das Modul sorgt für Idempotenz. Wenn bereits eine gewünschte Ressource mit derselben Konfiguration vorhanden ist, wird die Bereitstellung ignoriert.

Azure Resource Manager-Vorlagen sind eine JSON-basierte Sprache zum Definieren verschiedener Ressourcen in Azure. Das grundlegende Schema sieht ungefähr wie in Abbildung 10-14 aus.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "",
  "apiProfile": "",
  "parameters": {  },
  "variables": {  },
  "functions": [  ],
  "resources": [  ],
  "outputs": {  }
}

Abbildung 10-14: Schema für eine Resource Manager-Vorlage

In dieser Vorlage kann ein Speichercontainer innerhalb des Ressourcenabschnitts wie folgt definiert werden:

"resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "apiVersion": "2018-07-01",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {}
    }
  ],

Abbildung 10-15: Beispiel für ein Speicherkonto, das in einer Resource Manager-Vorlage definiert ist

Eine ARM-Vorlage kann mit dynamischen Umgebungs- und Konfigurationsinformationen parametrisiert werden. Auf diese Weise kann sie wiederverwendet werden, um verschiedene Umgebungen zu definieren, z. B. Entwicklung, Qualitätssicherung oder Produktion. Normalerweise erstellt die Vorlage alle Ressourcen innerhalb einer einzelnen Azure-Ressourcengruppe. Es ist möglich, bei Bedarf mehrere Ressourcengruppen in einer einzelnen Resource Manager-Vorlage zu definieren. Sie können alle Ressourcen in einer Umgebung löschen, indem Sie die Ressourcengruppe selbst löschen. Die Kostenanalyse kann auch auf Ressourcengruppenebene ausgeführt werden, wodurch Sie schnell feststellen können, wie viel die einzelnen Umgebungen kosten.

Es gibt viele Beispiele für ARM-Vorlagen im Projekt Azure-Schnellstartvorlagen auf GitHub. Sie können die Erstellung einer neuen Vorlage beschleunigen oder eine vorhandene Vorlage ändern.

Resource Manager-Vorlagen können auf viele Arten ausgeführt werden. Vielleicht ist die einfachste Möglichkeit, sie einfach in das Azure-Portal einzufügen. Für experimentelle Bereitstellungen kann diese Methode schnell sein. Sie können auch als Teil eines Erstellungs- oder Releaseprozesses in Azure DevOps ausgeführt werden. Es gibt Aufgaben, die die Verbindungen mit Azure nutzen, um die Vorlagen auszuführen. Änderungen an den Resource Manager-Vorlagen werden schrittweise vorgenommen, d. h., wenn Sie eine neue Ressource hinzufügen möchten, müssen Sie diese lediglich der Vorlage hinzufügen. Das Tool gleicht die Unterschiede zwischen den aktuellen Ressourcen und den in der Vorlage definierten Ressourcen ab. Die Ressourcen werden dann erstellt oder geändert, sodass sie mit den Definitionen der Vorlage übereinstimmen.

Terraform

Cloudnative Anwendungen sind oft so konstruiert, dass sie cloud agnostic sind. Dadurch ist die Anwendung nicht eng an einen bestimmten Cloudanbieter gebunden und kann in jeder öffentlichen Cloud bereitgestellt werden.

Terraform ist ein kommerzielles Vorlagentool, das cloudnative Anwendungen für alle großen Cloudanbieter bereitstellen kann: Azure, Google Cloud Platform, AWS und AliCloud. Anstatt JSON als Vorlagendefinitionssprache zu verwenden, wird die etwas weniger ausführliche HCL (Hashicorp Configuration Language) verwendet.

Ein Beispiel für eine Terraform-Datei, die dasselbe leistet wie die vorherige Resource Manager-Vorlage (Abbildung 10-15), finden Sie in Abbildung 10-16:

provider "azurerm" {
  version = "=1.28.0"
}

resource "azurerm_resource_group" "testrg" {
  name     = "production"
  location = "West US"
}

resource "azurerm_storage_account" "testsa" {
  name                     = "${var.storageAccountName}"
  resource_group_name      = "${azurerm_resource_group.testrg.name}"
  location                 = "${var.region}"
  account_tier             = "${var.tier}"
  account_replication_type = "${var.replicationType}"

}

Abbildung 10-16: Beispiel für eine Resource Manager-Vorlage

Terraform bietet auch intuitive Fehlermeldungen für Problemvorlagen. Es gibt auch eine praktische Validierungsaufgabe, die in der Erstellungsphase verwendet werden kann, um Vorlagenfehler frühzeitig zu erkennen.

Wie bei den Resource Manager-Vorlagen gibt es auch für die Bereitstellung von Terraform-Vorlagen Befehlszeilentools. Es gibt auch von der Community erstellte Aufgaben in Azure Pipelines, die Terraform-Vorlagen überprüfen und anwenden können.

Manchmal geben Terraform- und ARM-Vorlagen sinnvolle Werte aus, z. B. eine Zeichenfolge für eine neu erstellte Datenbank. Diese Informationen können in der Buildpipeline erfasst und in nachfolgenden Aufgaben verwendet werden.

Azure CLI-Skripts und -Aufgaben

Schließlich können Sie die Azure CLI nutzen, um ein deklaratives Skript für Ihre Cloudinfrastruktur zu verwenden. Azure CLI-Skripts können erstellt, gesucht und freigegeben werden, um nahezu jede Azure-Ressource bereitzustellen und zu konfigurieren. Die CLI ist benutzerfreundlich und leicht zu erlernen. Skripts werden entweder in PowerShell oder Bash ausgeführt. Sie sind auch einfach zu debuggen, insbesondere im Vergleich zu ARM-Vorlagen.

Azure CLI-Skripts eignen sich gut, wenn Sie Ihre Infrastruktur auflösen und erneut bereitstellen müssen. Das Aktualisieren einer vorhandenen Umgebung kann schwierig sein. Viele CLI-Befehle sind nicht idempotent. Dies bedeutet, dass sie die Ressource jedes Mal neu erstellen, wenn sie ausgeführt werden, auch wenn die Ressource bereits vorhanden ist. Es ist jederzeit möglich, Code hinzuzufügen, der vor dem Erstellen einer Ressource prüft, ob diese vorhanden ist. Dadurch kann Ihr Skript jedoch überladen und schwer zu verwalten sein.

Diese Skripts können auch in Azure DevOps-Pipelines als Azure CLI tasks eingebettet werden. Durch Ausführen der Pipeline wird das Skript aufgerufen.

Abbildung 10-17 zeigt einen YAML-Inhaltsausschnitt, der die Version der Azure CLI und die Details des Abonnements auflistet. Beachten Sie, wie Azure CLI-Befehle in ein Inlineskript einbezogen werden.

- task: AzureCLI@2
  displayName: Azure CLI
  inputs:
    azureSubscription: <Name of the Azure Resource Manager service connection>
    scriptType: ps
    scriptLocation: inlineScript
    inlineScript: |
      az --version
      az account show

Abbildung 10-17: Azure CLI-Skript

In dem Artikel Was ist „Infrastructure-as-Code“? beschreibt Autor Sam Guckenheimer, wie Teams, die IaC implementieren, stabile Umgebungen schnell und im großen Stil bereitstellen können. Teams vermeiden die manuelle Konfiguration von Umgebungen und erzwingen Konsistenz, indem sie den gewünschten Zustand ihrer Umgebungen über Code darstellen. Infrastrukturbereitstellungen mit IaC sind wiederholbar und verhindern Laufzeitprobleme, die durch Konfigurationsabweichungen oder fehlende Abhängigkeiten verursacht werden. DevOps-Teams können mit einer einheitlichen Reihe von Methoden und Tools zusammenarbeiten, um Anwendungen und die dazugehörige Infrastruktur schnell, zuverlässig und im großen Stil bereitzustellen.