Övning – Lägga till logik för villkorsstyrning i ARM-mallar

Slutförd

I de tidigare övningarna har du arbetat med virtuella Linux-datorer. Nu ska du variera dig lite och fokusera på hantering av lagringskonton.

Anta att du har tre miljöer som du behöver distribuera till: Dev, Staging och Production.

  • Utvecklingsmiljön är den första platsen där du samlar allt som appen behöver. I den här miljön kan det finnas webbservrar, en lastbalanserare och en databas.
  • I mellanlagringsmiljön görs de sista testerna innan nya appfunktioner släpps till dina slutanvändare.
  • Det är i produktionsmiljön som slutanvändarna använder din app.

När du flyttar från utvecklingsmiljön till produktionsmiljön behövs ytterligare infrastruktur. I produktionsmiljön behöver du till exempel ett extra lagringskonto som du inte behöver i de tidigare miljöerna.

Här använder du ett villkor som styr när ett lagringskonto ska etableras. På så sätt kan du hantera de tre infrastrukturmiljöerna från samma ARM-mall.

Skapa ARM-mallen

Här skapar du en ARM-mall (Azure Resource Manager) som definierar en lagringskontoresurs.

Mallen definierar också två parametrar:

  • environment: namnet på den aktuella miljön.
  • storageAccountName: namnet på lagringskontot.

environment kan ha något av tre värden: dev, stagingeller production. Villkoret gör att lagringskontot bara etableras när environment är lika med production.

  1. Skapa en fil i Visual Studio Code med namnet condition.json i samma katalog som azuredeploy.json.

  2. Lägg till följande innehåll i 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": {}
    }
    

Här ska du distribuera en ARM-mall med en condition-konstruktion via PowerShell och Az-modulen.

Etablera utvecklingsmiljön

Här distribuerar du ARM-mallen till utvecklingsmiljön. Det gör du genom att ange värdet dev för mallparametern environment.

Eftersom villkoret gör att lagringskontot bara etableras när environment är lika med production väntar du dig att mallen inte ska etablera lagringskontot. Du förväntar dig alltså en distribution som inte innehåller några resurser.

  1. Skapa en PowerShell-variabel för namnet på lagringskontot.

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

    Lagringskontonamn måste vara unika. Delen Get-Random ser till att namnet på lagringskontot slutar med en slumpmässig serie siffror.

  2. Kör följande New-AzResourceGroupDeployment kommando för att distribuera mallen till Dev-miljön:

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

Verifiera distributionen till utvecklingsmiljön

Kom ihåg att du förväntar dig att mallen inte har etablerat lagringskontot.

Det kontrollerar du genom att köra kommandot Get-AzStorageAccount och kontrollera om lagringskontots namn används eller inte.

Kör kommandot Get-AzStorageAccount:

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

Ditt resultat ser ut ungefär så här:

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

Det här anger att lagringskontot inte har etablerats ännu. Det är som du förväntar dig eftersom du inte har distribuerat till produktionsmiljön ännu.

Etablera till produktionsmiljön

Här distribuerar du ARM-mallen till produktionsmiljön, ungefär som när du distribuerade till utvecklingsmiljön.

Vi påminner om hur villkoret ser ut i mallen:

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

För att utlösa det här villkoret anger du production som värde för mallparametern environment.

Kör följande New-AzResourceGroupDeployment kommando för att distribuera mallen till produktionsmiljön:

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

Verifiera distributionen till produktion

Den här gånger förväntar du dig att mallen har etablerat lagringskontot.

Det kontrollerar du genom att köra kommandot Get-AzStorageAccount och verifiera att lagringskontots namn används.

Kör följande Get-AzStorageAccount-kommando:

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

Den här gången får du andra utdata. I stället för ett felmeddelande visas den här tabellens med information om din lagringskontoresurs:

Ditt resultat ser ut ungefär så här:

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

De här värdena anger att lagringskontot har etablerats som förväntat.

Även om det här är ett enkelt exempel så ser du hur du kan distribuera baserat på ett villkor.

I praktiken skulle utvecklingsmiljön, mellanlagringsmiljön och produktionsmiljön innehålla fler Azure-resurser för beräkning, nätverksfunktioner och lagring. Varje miljö skulle sannolikt hanteras via en egen resursgrupp så att den kan etableras och behandlas som en enskild enhet.

Skapa ARM-mallen

Här skapar du en ARM-mall (Azure Resource Manager) som definierar en lagringskontoresurs.

Mallen definierar också två parametrar:

  • environment: namnet på den aktuella miljön.
  • storageAccountName: namnet på lagringskontot.

environment kan ha något av tre värden: dev, stagingeller production. Villkoret gör att lagringskontot bara etableras när environment är lika med production.

  1. Skapa en fil i Visual Studio Code med namnet condition.json i samma katalog som azuredeploy.json.

  2. Lägg till följande innehåll i 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": {}
    }
    

Etablera utvecklingsmiljön

Här distribuerar du ARM-mallen till utvecklingsmiljön. Det gör du genom att ange värdet dev för mallparametern environment.

Eftersom villkoret gör att lagringskontot bara etableras när environment är lika med production väntar du dig att mallen inte ska etablera lagringskontot. Du förväntar dig alltså en distribution som inte innehåller några resurser.

  1. Skapa en Bash-variabel för namnet på lagringskontot.

    STORAGE_ACCT_NAME=tailwindsa$RANDOM
    

    Lagringskontonamn måste vara unika. Delen $RANDOM ser till att namnet på lagringskontot slutar med en slumpmässig serie siffror.

  2. Kör följande az deployment group create kommando för att distribuera mallen till Dev-miljön:

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

Verifiera distributionen till utvecklingsmiljön

Kom ihåg att du förväntar dig att mallen inte har etablerat lagringskontot.

Det kontrollerar du genom att köra kommandot az storage account check-name och kontrollera om lagringskontots namn används eller inte.

Kör följande az storage account check-name-kommando:

az storage account check-name --name $STORAGE_ACCT_NAME

Följande visas:

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

Värdet för nameAvailable är true, vilket innebär att lagringskontots namn fortfarande är tillgängligt och inte har etablerats ännu. Det är som du förväntar dig eftersom du inte har distribuerat till produktionsmiljön ännu.

Etablera till produktionsmiljön

Här distribuerar du ARM-mallen till produktionsmiljön, ungefär som du gjorde för Dev-miljön .

Vi påminner om hur villkoret ser ut i mallen:

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

För att utlösa det här villkoret anger du production som värde för mallparametern environment.

Kör följande az deployment group create kommando för att distribuera mallen till produktionsmiljön:

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

Verifiera distributionen till produktion

Den här gånger förväntar du dig att mallen har etablerat lagringskontot.

Det kontrollerar du genom att köra kommandot az storage account check-name och verifiera att lagringskontots namn används.

Kör följande az storage account check-name-kommando:

az storage account check-name --name $STORAGE_ACCT_NAME

Ditt resultat ser ut ungefär så här:

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

De här värdena anger att lagringskontot har etablerats som förväntat.

Även om det här är ett enkelt exempel så ser du hur du kan distribuera baserat på ett villkor.

I praktiken skulle utvecklingsmiljön, mellanlagringsmiljön och produktionsmiljön innehålla fler Azure-resurser för beräkning, nätverksfunktioner och lagring. Varje miljö skulle sannolikt hanteras via en egen resursgrupp så att den kan etableras och behandlas som en enskild enhet.