Ćwiczenie — dodawanie logiki warunkowej do szablonu usługi ARM

Ukończone

W poprzednich ćwiczeniach pracowaliśmy z maszynami wirtualnymi z systemem Linux. W tym miejscu zmienisz odrobinę ustawienia i skoncentrujesz się na zarządzaniu kontami magazynu.

Załóżmy, że masz trzy środowiska, które należy wdrożyć w: Dev, Staging i Production.

  • Środowisko deweloperskie to pierwsze miejsce, w którym łączą się wszystkie elementy wymagane przez aplikację. To środowisko może obejmować serwery sieci Web, moduł równoważenia obciążenia i bazę danych.
  • Środowisko przejściowe to miejsce, w którym testy końcowe są wykonywane przed udostępnieniem nowych funkcji aplikacji użytkownikom końcowym.
  • Środowisko produkcyjne jest miejscem, w którym użytkownicy końcowi uzyskują dostęp do aplikacji.

Podczas przechodzenia ze środowiska deweloperskiego do produkcyjnego potrzebna jest dodatkowa infrastruktura. Na przykład w środowisku produkcyjnym wymagane jest dodatkowe konto magazynu, które nie jest potrzebne w poprzednich środowiskach.

W tym miejscu możesz użyć warunku, aby sterować, kiedy konto magazynu ma zostać ustanowione. Dzięki temu możesz obsługiwać poszczególne środowiska infrastruktury z tego samego szablonu usługi ARM.

Tworzenie szablonu usługi ARM

W tym miejscu utworzysz szablon usługi Azure Resource Manager (ARM), który definiuje zasób konta magazynu.

Szablon definiuje również dwa parametry:

  • environment: nazwa bieżącego środowiska.
  • storageAccountName: nazwa konta magazynu.

Parametr environment może mieć jedną z trzech wartości: dev, staging lub production. Warunek aprowiduje konto magazynu tylko wtedy, gdy parametr environment równa się production.

  1. W programie Visual Studio Code utwórz plik o nazwie condition.json w tym samym katalogu, który zawiera plik azuredeploy.json.

  2. Dodaj tę zawartość do condition.json:

    {
      "$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": {}
    }
    

Tutaj wdrożysz szablon usługi ARM z konstrukcją warunkową przy użyciu programu PowerShell i modułu Az.

Inicjowanie ustanowienia środowiska deweloperskiego

W tym miejscu wdrożysz szablon usługi ARM do środowiska deweloperskiego. W tym celu należy ustawić parametr szablonu environment na wartość dev.

Ponieważ warunek aprowiduje konto magazynu tylko wtedy, gdy parametr environment równa się production, oczekujesz, że szablon nie aprowiduje konta magazynu. Innymi słowy oczekujesz, że zasoby zawarte we wdrożeniu są zerowe.

  1. Utwórz zmienną programu PowerShell, która zawiera nazwę konta magazynu.

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

    Nazwy kont magazynu muszą być unikatowe. Część Get-Random gwarantuje, że nazwa konta magazynu zostanie zakończona losową serią liczb.

  2. Uruchom następujące New-AzResourceGroupDeployment polecenie, aby wdrożyć szablon w środowisku deweloperskim:

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

Weryfikowanie wdrożenia w środowisku deweloperskim

Należy pamiętać, że zgodnie z oczekiwaniami szablon nie ma ustanowić konta magazynu.

Aby sprawdzić ten fakt, uruchom polecenie Get-AzStorageAccount, aby sprawdzić, czy nazwa konta magazynu jest już w użyciu.

Uruchom polecenie Get-AzStorageAccount.

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

Dane wyjściowe będą wyglądać mniej więcej tak:

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

Oznacza to, że konto magazynu nie zostało jeszcze aprowidowane. Jest to zgodne z oczekiwaniami, ponieważ nie nastąpiło jeszcze wdrożenie w środowisku produkcyjnym.

Ustanawianie środowiska produkcyjnego

W tym miejscu wdrażasz szablon usługi ARM w środowisku produkcyjnym, podobnie jak w przypadku środowiska deweloperskiego.

Dla przypomnienia, warunek w szablonie wygląda tak:

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

Aby wyzwolić ten warunek, należy ustawić parametr szablonu environment na wartość production.

Uruchom następujące New-AzResourceGroupDeployment polecenie, aby wdrożyć szablon w środowisku produkcyjnym:

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

Weryfikowanie wdrożenia w środowisku produkcyjnym

Tym razem zgodnie z oczekiwaniami szablon ma ustanowić konto magazynu.

Aby zweryfikować ten fakt, uruchom ponownie polecenie Get-AzStorageAccount w celu sprawdzenia, czy nazwa konta magazynu jest w użyciu.

Uruchom następujące polecenie Get-AzStorageAccount:

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

Tym razem uzyskasz różne inne dane wyjściowe. Zamiast komunikatu o błędzie są wyświetlane dane wyjściowe tej tabeli, które przedstawiają informacje o zasobie konta magazynu:

Dane wyjściowe będą wyglądać mniej więcej tak:

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

Te wartości informują o tym, że konto magazynu zostało ustanowione zgodnie z oczekiwaniami.

Chociaż jest to podstawowy przykład, ilustruje on wdrażanie na podstawie warunku.

W praktyce środowiska deweloperskie, przejściowei produkcyjne mogą zawierać dodatkowe zasoby platformy Azure, które będą obsługiwać potrzeby obliczeniowe, sieciowe i magazynowe. Każde środowisko prawdopodobnie będzie zarządzane za pomocą własnej grupy zasobów, aby można było je ustanowić i traktować jako pojedynczą jednostkę.

Tworzenie szablonu usługi ARM

W tym miejscu utworzysz szablon usługi Azure Resource Manager (ARM), który definiuje zasób konta magazynu.

Szablon definiuje również dwa parametry:

  • environment: nazwa bieżącego środowiska.
  • storageAccountName: nazwa konta magazynu.

Parametr environment może mieć jedną z trzech wartości: dev, staging lub production. Warunek aprowiduje konto magazynu tylko wtedy, gdy parametr environment równa się production.

  1. W programie Visual Studio Code utwórz plik o nazwie condition.json w tym samym katalogu, który zawiera plik azuredeploy.json.

  2. Dodaj tę zawartość do condition.json:

    {
      "$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": {}
    }
    

Inicjowanie ustanowienia środowiska deweloperskiego

W tym miejscu wdrożysz szablon usługi ARM do środowiska deweloperskiego. W tym celu należy ustawić parametr szablonu environment na wartość dev.

Ponieważ warunek aprowiduje konto magazynu tylko wtedy, gdy parametr environment równa się production, oczekujesz, że szablon nie aprowiduje konta magazynu. Innymi słowy oczekujesz, że zasoby zawarte we wdrożeniu są zerowe.

  1. Utwórz zmienną Bash, która zawiera nazwę konta magazynu.

    STORAGE_ACCT_NAME=tailwindsa$RANDOM
    

    Nazwy kont magazynu muszą być unikatowe. Część $RANDOM gwarantuje, że nazwa konta magazynu zostanie zakończona losową serią liczb.

  2. Uruchom następujące az deployment group create polecenie, aby wdrożyć szablon w środowisku deweloperskim:

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

Weryfikowanie wdrożenia w środowisku deweloperskim

Należy pamiętać, że zgodnie z oczekiwaniami szablon nie ma ustanowić konta magazynu.

Aby sprawdzić ten fakt, uruchom polecenie az storage account check-name, aby sprawdzić, czy nazwa konta magazynu jest już w użyciu.

Uruchom następujące polecenie az storage account check-name:

az storage account check-name --name $STORAGE_ACCT_NAME

Zostaną wyświetlone następujące dane:

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

Wartość nameAvailable jest równa true, co oznacza, że nazwa konta magazynu jest nadal dostępna i nie została jeszcze aprowidowana. Jest to zgodne z oczekiwaniami, ponieważ nie nastąpiło jeszcze wdrożenie w środowisku produkcyjnym.

Ustanawianie środowiska produkcyjnego

W tym miejscu wdrożysz szablon usługi ARM w środowisku produkcyjnym, podobnie jak w przypadku środowiska deweloperskiego.

Dla przypomnienia, warunek w szablonie wygląda tak:

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

Aby wyzwolić ten warunek, należy ustawić parametr szablonu environment na wartość production.

Uruchom następujące az deployment group create polecenie, aby wdrożyć szablon w środowisku produkcyjnym:

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

Weryfikowanie wdrożenia w środowisku produkcyjnym

Tym razem zgodnie z oczekiwaniami szablon ma ustanowić konto magazynu.

Aby zweryfikować ten fakt, uruchom ponownie polecenie az storage account check-name w celu sprawdzenia, czy nazwa konta magazynu jest w użyciu.

Uruchom następujące polecenie az storage account check-name:

az storage account check-name --name $STORAGE_ACCT_NAME

Dane wyjściowe będą wyglądać mniej więcej tak:

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

Te wartości informują o tym, że konto magazynu zostało ustanowione zgodnie z oczekiwaniami.

Chociaż jest to podstawowy przykład, ilustruje on wdrażanie na podstawie warunku.

W praktyce środowiska deweloperskie, przejściowei produkcyjne mogą zawierać dodatkowe zasoby platformy Azure, które będą obsługiwać potrzeby obliczeniowe, sieciowe i magazynowe. Każde środowisko prawdopodobnie będzie zarządzane za pomocą własnej grupy zasobów, aby można było je ustanowić i traktować jako pojedynczą jednostkę.