Exercício – Adicionar lógica condicional ao modelo do ARM

Concluído

Nos exercícios anteriores, trabalhou com máquinas virtuais do Linux. Aqui, vai ser um pouco diferente e vai centrar-se na gestão das contas de armazenamento.

Digamos que você tenha três ambientes nos quais precisa implantar: Desenvolvimento, Preparação e Produção.

  • O ambiente Dev é o primeiro lugar onde tudo o que a aplicação precisa é reunido. Este ambiente pode incluir servidores Web, um balanceador de carga e uma base de dados.
  • O ambiente de Processo de teste é onde o teste final ocorre antes de as novas funcionalidades da aplicação serem lançadas para os utilizadores finais.
  • O ambiente de Produção é onde os utilizadores finais acedem à aplicação.

Ao passar de Dev para Produção, precisa de uma infraestrutura adicional. Por exemplo, em Produção, é necessária uma conta de armazenamento adicional que não foi necessária nos ambientes anteriores.

Vai utilizar uma condição para controlar quando uma conta de armazenamento é aprovisionada. Este procedimento permite-lhe suportar cada um dos ambientes de infraestruturas no mesmo modelo do ARM.

Criar o modelo ARM

Agora, irá criar um modelo do Azure Resource Manager (ARM) que define um recurso da conta de armazenamento.

O modelo também define dois parâmetros:

  • environment: o nome do ambiente atual.
  • storageAccountName: o nome da conta de armazenamento.

O environment pode ter um de três valores: dev, staging ou production. A condição aprovisiona a conta de armazenamento apenas quando environment é igual a production.

  1. No Visual Studio Code, crie um ficheiro chamado condition.json no mesmo diretório que contém azuredeploy.json.

  2. Adicione estes conteúdos ao 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": {}
    }
    

Agora, irá utilizar o módulo Az e o PowerShell para implementar um modelo do ARM com uma construção de condição.

Aprovisionar o ambiente Dev

Vai agora implementar o modelo do ARM no ambiente Dev. Para tal, vai definir o parâmetro de modelo environment como dev.

Como a condição aprovisiona a conta de armazenamento apenas quando environment é igual a production, espera que o modelo não aprovisione a conta de armazenamento. Por outras palavras, espera uma implementação com zero recursos.

  1. Crie uma variável do PowerShell com o nome da conta de armazenamento.

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

    Os nomes da conta de armazenamento devem ser exclusivos. A parte Get-Random garante que o nome da conta de armazenamento termina numa série de números aleatória.

  2. Execute o seguinte New-AzResourceGroupDeployment comando para implantar o modelo no ambiente de desenvolvimento:

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

Verificar a implementação no ambiente Dev

Lembre-se de que espera que o modelo não tenha aprovisionado a conta de armazenamento.

Para verificar este facto, execute o comando Get-AzStorageAccount para verificar se o nome da conta de armazenamento já está em utilização.

Execute o comando Get-AzStorageAccount:

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

A saída é semelhante ao seguinte:

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

Tal indica que a conta de armazenamento ainda não foi aprovisionada. Espera que tal aconteça porque ainda não implementou no ambiente de Produção.

Aprovisionar o ambiente de Produção

Vai agora implementar o modelo do ARM no ambiente de Produção, à semelhança do que fez para o ambiente Dev.

Para relembrar, esta é a aparência da condição no modelo:

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

Para acionar esta condição, deve definir o parâmetro de modelo environment como production.

Execute o seguinte New-AzResourceGroupDeployment comando para implantar o modelo no ambiente de produção:

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

Verificar a implementação no ambiente de Produção

Desta vez, espera que o modelo tenha aprovisionado a conta de armazenamento.

Para verificar este facto, execute o comando Get-AzStorageAccount novamente para verificar se o nome da conta de armazenamento está em utilização.

Execute o seguinte comando Get-AzStorageAccount:

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

Desta vez, obterá uma saída diferente. Em vez de uma mensagem de erro, apresenta esta saída de tabela que mostra informações sobre o recurso da conta de armazenamento:

A saída é semelhante ao seguinte:

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

Estes valores informam que a conta de armazenamento foi aprovisionada conforme o esperado.

Embora este seja um exemplo básico, verá como o pode implementar com base numa condição.

Na prática, os ambientes Dev, Processo de teste e Produção incluirão recursos adicionais do Azure para suportar as necessidades de computação, de rede e de armazenamento. Cada ambiente será provavelmente gerido através do seu próprio grupo de recursos para que possa ser aprovisionado e tratado como uma única unidade.

Criar o modelo ARM

Agora, irá criar um modelo do Azure Resource Manager (ARM) que define um recurso da conta de armazenamento.

O modelo também define dois parâmetros:

  • environment: o nome do ambiente atual.
  • storageAccountName: o nome da conta de armazenamento.

O environment pode ter um de três valores: dev, staging ou production. A condição aprovisiona a conta de armazenamento apenas quando environment é igual a production.

  1. No Visual Studio Code, crie um ficheiro chamado condition.json no mesmo diretório que contém azuredeploy.json.

  2. Adicione estes conteúdos ao 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": {}
    }
    

Aprovisionar o ambiente Dev

Vai agora implementar o modelo do ARM no ambiente Dev. Para tal, vai definir o parâmetro de modelo environment como dev.

Como a condição aprovisiona a conta de armazenamento apenas quando environment é igual a production, espera que o modelo não aprovisione a conta de armazenamento. Por outras palavras, espera uma implementação com zero recursos.

  1. Crie uma variável Bash com o nome da conta de armazenamento.

    STORAGE_ACCT_NAME=tailwindsa$RANDOM
    

    Os nomes da conta de armazenamento devem ser exclusivos. A parte $RANDOM garante que o nome da conta de armazenamento termina numa série de números aleatória.

  2. Execute o seguinte az deployment group create comando para implantar o modelo no ambiente de desenvolvimento:

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

Verificar a implementação no ambiente Dev

Lembre-se de que espera que o modelo não tenha aprovisionado a conta de armazenamento.

Para verificar este facto, execute o comando az storage account check-name para verificar se o nome da conta de armazenamento já está em utilização.

Execute o seguinte comando az storage account check-name:

az storage account check-name --name $STORAGE_ACCT_NAME

Verá o seguinte:

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

O valor de nameAvailable é true, o que significa que o nome da conta de armazenamento ainda está disponível e ainda não foi aprovisionado. Espera que tal aconteça porque ainda não implementou no ambiente de Produção.

Aprovisionar o ambiente de Produção

Aqui, você implanta o modelo ARM no ambiente de produção, semelhante ao que fez para o ambiente de desenvolvimento .

Para relembrar, esta é a aparência da condição no modelo:

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

Para acionar esta condição, deve definir o parâmetro de modelo environment como production.

Execute o seguinte az deployment group create comando para implantar o modelo no ambiente de produção:

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

Verificar a implementação no ambiente de Produção

Desta vez, espera que o modelo tenha aprovisionado a conta de armazenamento.

Para verificar este facto, execute o comando az storage account check-name novamente para verificar se o nome da conta de armazenamento está em utilização.

Execute o seguinte comando az storage account check-name:

az storage account check-name --name $STORAGE_ACCT_NAME

A saída é semelhante ao seguinte:

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

Estes valores informam que a conta de armazenamento foi aprovisionada conforme o esperado.

Embora este seja um exemplo básico, verá como o pode implementar com base numa condição.

Na prática, os ambientes Dev, Processo de teste e Produção incluirão recursos adicionais do Azure para suportar as necessidades de computação, de rede e de armazenamento. Cada ambiente será provavelmente gerido através do seu próprio grupo de recursos para que possa ser aprovisionado e tratado como uma única unidade.