Übung: Hinzufügen von bedingter Logik zu Ihrer ARM-Vorlage

Abgeschlossen

In den vorherigen Übungen haben Sie mit virtuellen Linux-Computern gearbeitet. Hier verlagern Sie den Fokus ein wenig und konzentrieren sich auf die Verwaltung von Speicherkonten.

Nehmen wir an, dass Sie drei Umgebungen nutzen, in denen Bereitstellungen erfolgen sollen: dev, staging und production.

  • Die dev-Umgebung ist der erste Ort, an dem alles, was Ihre Anwendung benötigt, zusammenkommt. Diese Umgebung kann Webserver, einen Load Balancer und eine Datenbank enthalten.
  • In der staging-Umgebung werden abschließende Tests durchgeführt, bevor Endbenutzern neue Anwendungsfunktionen zur Verfügung gestellt werden.
  • Die production-Umgebung ist der Ort, an dem Endbenutzer auf Ihre Anwendung zugreifen.

Wenn Sie von dev zu production wechseln, benötigen Sie zusätzliche Infrastruktur. Beispielsweise benötigen Sie in production ein zusätzliches Speicherkonto, das Sie in den vorherigen Umgebungen nicht benötigen.

Hier verwenden Sie eine Bedingung, um zu steuern, wann ein Speicherkonto bereitgestellt wird. Auf diese Weise können Sie die einzelnen Infrastrukturumgebungen mit der gleichen ARM-Vorlage unterstützen.

Erstellen der ARM-Vorlage

Hier erstellen Sie eine ARM-Vorlage (Azure Resource Manager), die eine Speicherkontoressource definiert.

Die Vorlage definiert auch zwei Parameter:

  • environment: Der Name der aktuellen Umgebung.
  • storageAccountName: Der Name des Speicherkontos.

environment kann einen von drei Werten aufweisen: dev, staging oder production. Mit der Bedingung wird das Speicherkonto nur dann bereitgestellt, wenn environment gleich production ist.

  1. Erstellen Sie in Visual Studio Code eine Datei mit dem Namen condition.json in demselben Verzeichnis, das azuredeploy.json enthält.

  2. Fügen Sie diesen Inhalt condition.json hinzu:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environment": {
          "type": "string",
          "defaultValue": "dev",
          "allowedValues": [
            "dev",
            "staging",
            "production"
          ],
          "metadata": {
            "description": "a value that represents the current environment"
          }
        },
        "storageAccountName": {
          "type": "string",
          "metadata": {
            "description": "a name for the account"
          }
        }
      },
      "functions": [],
      "variables": {},
      "resources": [
        {
          "condition": "[equals(parameters('environment'),'production')]",
          "name": "[parameters('storageAccountName')]",
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "tags": {
            "displayName": "[parameters('storageAccountName')]"
          },
          "location": "[resourceGroup().location]",
          "kind": "StorageV2",
          "sku": {
            "name": "Premium_LRS",
            "tier": "Premium"
          }
        }
      ],
      "outputs": {}
    }
    

Hier stellen Sie mithilfe von PowerShell und dem Az-Modul mit einem condition-Konstrukt eine ARM-Vorlage bereit.

Bereitstellen der Entwicklungsumgebung

Hier stellen Sie die ARM-Vorlage in der Umgebung dev bereit. Hierzu legen Sie den environment-Vorlagenparameter auf dev fest.

Da die Bedingung das Speicherkonto nur dann bereitstellt, wenn environmentproduction entspricht, erwarten Sie, dass die Vorlage das Speicherkonto nicht bereitstellt. Anders ausgedrückt: Sie erwarten eine Bereitstellung, die keine Ressourcen enthält.

  1. Erstellen Sie eine PowerShell-Variable, die den Namen des Speicherkontos enthält.

    $STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
    

    Namen von Speicherkonten müssen eindeutig sein. Der Get-Random-Teil stellt sicher, dass der Speicherkontoname mit einer zufälligen Reihe von Zahlen endet.

  2. Führen Sie den folgenden Befehl New-AzResourceGroupDeployment aus, um die Vorlage in der dev-Umgebung bereitzustellen:

    New-AzResourceGroupDeployment `
      -TemplateFile "./condition.json" `
      -storageAccountName $STORAGE_ACCT_NAME `
      -environment dev
    

Überprüfen der Bereitstellung in „dev“

Denken Sie daran, dass Sie davon ausgehen, dass die Vorlage das Speicherkonto nicht bereitgestellt hat.

Um dies zu überprüfen, führen Sie den Befehl Get-AzStorageAccount aus, um zu überprüfen, ob der Name des Speicherkontos bereits verwendet wird.

Führen Sie den Befehl Get-AzStorageAccount aus:

Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>

Die Ausgabe sieht ungefähr wie folgt aus:

Get-AzStorageAccount: The Resource 'Microsoft.Storage/storageAccounts/tailwindsa4736629' under resource group '<rgn>name of resource group</rgn>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix

Sie weist darauf hin, dass das Speicherkonto noch nicht bereitgestellt wurde. Dies ist zu erwarten, da Sie noch keine Bereitstellung für die Umgebung „production“ ausgeführt haben.

Bereitstellen der Umgebung „production“

Hier stellen Sie die ARM-Vorlage in der Umgebung production bereit, ähnlich wie bei der Umgebung dev.

Als Auffrischung: So sieht die Bedingung in der Vorlage aus:

"condition": "[equals(parameters('environment'),'production')]"

Um diese Bedingung auszulösen, legen Sie den environment-Vorlagenparameter auf production fest.

Führen Sie den folgenden Befehl New-AzResourceGroupDeployment aus, um die Vorlage in der Umgebung production bereitzustellen:

New-AzResourceGroupDeployment `
  -TemplateFile "./condition.json" `
  -storageAccountName $STORAGE_ACCT_NAME `
  -environment production

Überprüfen der Bereitstellung in „production“

Dieses Mal erwarten Sie, dass die Vorlage das Speicherkonto bereitgestellt hat.

Um dies zu überprüfen, führen Sie den Befehl Get-AzStorageAccount erneut aus, um zu bestätigen, dass der Name des Speicherkontos verwendet wird.

Führen Sie den folgenden Befehl Get-AzStorageAccount aus:

Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>

Dieses Mal erhalten Sie eine andere Ausgabe. Anstelle einer Fehlermeldung wird diese Tabellenausgabe angezeigt, in der Informationen zu Ihrer Speicherkontoressource enthalten sind:

Die Ausgabe sieht ungefähr wie folgt aus:

Location Name              Type                              Kind
-------- ----              ----                              ----
westus   tailwindsa4736629 Microsoft.Storage/storageAccounts StorageV2

Diese Werte zeigen Ihnen, dass das Speicherkonto erwartungsgemäß bereitgestellt wurde.

Obwohl es sich hierbei um ein einfaches Beispiel handelt, können Sie erkennen, wie eine Bereitstellung basierend auf einer Bedingung erfolgt.

In der Praxis enthalten Ihre Umgebungen dev, staging und production zusätzliche Azure-Ressourcen zur Unterstützung ihrer Compute-, Netzwerk- und Speicheranforderungen. Jede Umgebung wird wahrscheinlich über eine eigene Ressourcengruppe verwaltet, damit Sie als einzelne Einheit bereitgestellt und behandelt werden kann.

Erstellen der ARM-Vorlage

Hier erstellen Sie eine ARM-Vorlage (Azure Resource Manager), die eine Speicherkontoressource definiert.

Die Vorlage definiert auch zwei Parameter:

  • environment: Der Name der aktuellen Umgebung.
  • storageAccountName: Der Name des Speicherkontos.

environment kann einen von drei Werten aufweisen: dev, staging oder production. Mit der Bedingung wird das Speicherkonto nur dann bereitgestellt, wenn environment gleich production ist.

  1. Erstellen Sie in Visual Studio Code eine Datei mit dem Namen condition.json in demselben Verzeichnis, das azuredeploy.json enthält.

  2. Fügen Sie diesen Inhalt condition.json hinzu:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "environment": {
          "type": "string",
          "defaultValue": "dev",
          "allowedValues": [
            "dev",
            "staging",
            "production"
          ],
          "metadata": {
            "description": "a value that represents the current environment"
          }
        },
        "storageAccountName": {
          "type": "string",
          "metadata": {
            "description": "a name for the account"
          }
        }
      },
      "functions": [],
      "variables": {},
      "resources": [
        {
          "condition": "[equals(parameters('environment'),'production')]",
          "name": "[parameters('storageAccountName')]",
          "type": "Microsoft.Storage/storageAccounts",
          "apiVersion": "2019-06-01",
          "tags": {
            "displayName": "[parameters('storageAccountName')]"
          },
          "location": "[resourceGroup().location]",
          "kind": "StorageV2",
          "sku": {
            "name": "Premium_LRS",
            "tier": "Premium"
          }
        }
      ],
      "outputs": {}
    }
    

Bereitstellen der Entwicklungsumgebung

Hier stellen Sie die ARM-Vorlage in der Umgebung dev bereit. Hierzu legen Sie den environment-Vorlagenparameter auf dev fest.

Da die Bedingung das Speicherkonto nur dann bereitstellt, wenn environmentproduction entspricht, erwarten Sie, dass die Vorlage das Speicherkonto nicht bereitstellt. Anders ausgedrückt: Sie erwarten eine Bereitstellung, die keine Ressourcen enthält.

  1. Erstellen Sie eine Bash-Variable, die den Namen des Speicherkontos enthält.

    STORAGE_ACCT_NAME=tailwindsa$RANDOM
    

    Namen von Speicherkonten müssen eindeutig sein. Der $RANDOM-Teil stellt sicher, dass der Speicherkontoname mit einer zufälligen Reihe von Zahlen endet.

  2. Führen Sie den folgenden Befehl az deployment group create aus, um die Vorlage in der dev-Umgebung bereitzustellen:

    az deployment group create \
      --template-file condition.json \
      --parameters storageAccountName=$STORAGE_ACCT_NAME environment=dev
    

Überprüfen der Bereitstellung in „dev“

Denken Sie daran, dass Sie davon ausgehen, dass die Vorlage das Speicherkonto nicht bereitgestellt hat.

Um dies zu überprüfen, führen Sie den Befehl az storage account check-name aus, um zu überprüfen, ob der Name des Speicherkontos bereits verwendet wird.

Führen Sie den folgenden Befehl az storage account check-name aus:

az storage account check-name --name $STORAGE_ACCT_NAME

Folgendes wird angezeigt:

{
  "message": null,
  "nameAvailable": true,
  "reason": null
}

Der Wert für nameAvailable ist true. Dies bedeutet, dass der Name des Speicherkontos noch verfügbar ist und noch nicht bereitgestellt wurde. Dies ist zu erwarten, da Sie noch keine Bereitstellung für die Umgebung „production“ ausgeführt haben.

Bereitstellen der Umgebung „production“

Hier stellen Sie die ARM-Vorlage in der Umgebung production bereit, ähnlich wie bei der Umgebung dev.

Als Auffrischung: So sieht die Bedingung in der Vorlage aus:

"condition": "[equals(parameters('environment'),'production')]"

Um diese Bedingung auszulösen, legen Sie den environment-Vorlagenparameter auf production fest.

Führen Sie den folgenden Befehl az deployment group create aus, um die Vorlage in der Umgebung production bereitzustellen:

az deployment group create \
  --template-file condition.json \
  --parameters storageAccountName=$STORAGE_ACCT_NAME environment=production

Überprüfen der Bereitstellung in „production“

Dieses Mal erwarten Sie, dass die Vorlage das Speicherkonto bereitgestellt hat.

Um dies zu überprüfen, führen Sie den Befehl az storage account check-name erneut aus, um zu bestätigen, dass der Name des Speicherkontos verwendet wird.

Führen Sie den folgenden Befehl az storage account check-name aus:

az storage account check-name --name $STORAGE_ACCT_NAME

Die Ausgabe sieht ungefähr wie folgt aus:

{
  "message": "The storage account named tailwindsa32100 is already taken.",
  "nameAvailable": false,
  "reason": "AlreadyExists"
}

Diese Werte zeigen Ihnen, dass das Speicherkonto erwartungsgemäß bereitgestellt wurde.

Obwohl es sich hierbei um ein einfaches Beispiel handelt, können Sie erkennen, wie eine Bereitstellung basierend auf einer Bedingung erfolgt.

In der Praxis enthalten Ihre Umgebungen dev, staging und production zusätzliche Azure-Ressourcen zur Unterstützung ihrer Compute-, Netzwerk- und Speicheranforderungen. Jede Umgebung wird wahrscheinlich über eine eigene Ressourcengruppe verwaltet, damit Sie als einzelne Einheit bereitgestellt und behandelt werden kann.