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

Concluído

Nos exercícios anteriores, você trabalhou com máquinas virtuais do Linux. Aqui, você muda um pouco e se concentra no gerenciamento de contas de armazenamento.

Digamos que você tenha três ambientes que precise implantar: desenvolvimento, preparo eprodução.

  • O ambiente de desenvolvimento é o primeiro lugar onde tudo que o seu aplicativo precisa se reúne. Esse ambiente pode incluir servidores Web, um balanceador de carga e um banco de dados.
  • O ambiente de preparo é onde o teste final acontece antes que novos recursos do aplicativo sejam lançados para seus usuários finais.
  • O ambiente de produção é onde os usuários finais acessam seu aplicativo.

Conforme você se move do desenvolvimento para a produção, precisa de uma infraestrutura adicional. Por exemplo, na produção, você precisa de uma conta de armazenamento adicional que não é necessária nos ambientes anteriores.

Aqui, você usa uma condição para controlar quando uma conta de armazenamento é provisionada. Isso permite que você dê suporte a cada um de seus ambientes de infraestrutura pelo mesmo modelo do ARM.

Criar um modelo do ARM

Aqui, você criará um modelo do ARM (Azure Resource Manager) que define um recurso de conta de armazenamento.

O modelo também define dois parâmetros:

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

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

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

  2. Adicione esse conteúdo 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": {}
    }
    

Aqui, você implantará um modelo do ARM, com um constructo de condição, usando o PowerShell e o módulo Az.

Provisionar o ambiente de desenvolvimento

Aqui, você implanta o modelo do ARM no ambiente de desenvolvimento. Faça isso definindo o parâmetro de modelo environment como dev.

Como a condição provisiona a conta de armazenamento apenas quando environment é igual a production, você espera que o modelo não provisione a conta de armazenamento. Em outras palavras, você espera uma implantação que contenha zero recurso.

  1. Crie uma variável do PowerShell que contenha 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 termine em uma série aleatória de números.

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

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

Verificar a implantação no desenvolvimento

Lembre-se: o esperado é que o modelo não tenha provisionado a conta de armazenamento.

Para verificar esse fato, execute o comando Get-AzStorageAccount para confirmar se o nome da conta de armazenamento já está em uso.

Execute o comando Get-AzStorageAccount:

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

A saída será semelhante a esta:

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

Isso indica que a conta de armazenamento ainda não foi provisionada. Você espera isso porque ainda não fez a implantação no ambiente de produção.

Provisionar o ambiente de produção

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

Como um atualizador, esta é a aparência da condição em seu modelo:

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

Para disparar essa condição, defina o parâmetro de modelo environment como production.

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

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

Verificar a implantação na produção

Desta vez, você espera que o modelo tenha provisionado a conta de armazenamento.

Para verificar esse fato, execute o comando Get-AzStorageAccount novamente para confirmar se o nome da conta de armazenamento já está em uso.

Execute o comando seguinte Get-AzStorageAccount:

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

Desta vez, você obterá outra saída. Em vez de uma mensagem de erro, ele mostra a saída da tabela que exibe informações sobre o recurso de conta de armazenamento:

A saída será semelhante a esta:

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

Esses valores informam que a conta de armazenamento foi provisionada conforme o esperado.

Embora esse seja um exemplo básico, você vê como implantar com base em uma condição.

Na prática, os ambientes de desenvolvimento, preparo e produção conteriam recursos adicionais do Azure para dar suporte às suas necessidades de computação, rede e armazenamento. Cada ambiente provavelmente seria gerenciado por meio de seu próprio grupo de recursos para que pudesse ser provisionado e tratado como uma única unidade.

Criar um modelo do ARM

Aqui, você criará um modelo do ARM (Azure Resource Manager) que define um recurso de conta de armazenamento.

O modelo também define dois parâmetros:

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

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

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

  2. Adicione esse conteúdo 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": {}
    }
    

Provisionar o ambiente de desenvolvimento

Aqui, você implanta o modelo do ARM no ambiente de desenvolvimento. Faça isso definindo o parâmetro de modelo environment como dev.

Como a condição provisiona a conta de armazenamento apenas quando environment é igual a production, você espera que o modelo não provisione a conta de armazenamento. Em outras palavras, você espera uma implantação que contenha zero recurso.

  1. Crie uma variável Bash que contenha 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 termine em uma série aleatória de números.

  2. Execute o seguinte comando az deployment group create 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 implantação no desenvolvimento

Lembre-se: o esperado é que o modelo não tenha provisionado a conta de armazenamento.

Para verificar esse fato, execute o comando az storage account check-name para conferir se o nome da conta de armazenamento já está em uso.

Execute o seguinte comando az storage account check-name:

az storage account check-name --name $STORAGE_ACCT_NAME

Você verá isto:

{
  "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 provisionado. Você espera isso porque ainda não fez a implantação no ambiente de produção.

Provisionar o ambiente de produção

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

Como um atualizador, esta é a aparência da condição em seu modelo:

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

Para disparar essa condição, defina o parâmetro de modelo environment como production.

Execute o seguinte comando az deployment group create 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 implantação na produção

Desta vez, você espera que o modelo tenha provisionado a conta de armazenamento.

Para verificar esse fato, execute o comando az storage account check-name novamente para confirmar se o nome da conta de armazenamento já está em uso.

Execute o seguinte comando az storage account check-name:

az storage account check-name --name $STORAGE_ACCT_NAME

A saída será semelhante a esta:

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

Esses valores informam que a conta de armazenamento foi provisionada conforme o esperado.

Embora esse seja um exemplo básico, você vê como implantar com base em uma condição.

Na prática, os ambientes de desenvolvimento, preparo e produção conteriam recursos adicionais do Azure para dar suporte às suas necessidades de computação, rede e armazenamento. Cada ambiente provavelmente seria gerenciado por meio de seu próprio grupo de recursos para que pudesse ser provisionado e tratado como uma única unidade.