Exercício – Aplicar boas práticas ao seu modelo usando o Kit de Ferramentas de Teste do Modelo do ARM

Concluído

Você faz parte de uma equipe de desenvolvimento da empresa Tailwind Traders. Como parte desse trabalho, você precisa criar modelos do ARM (Azure Resource Manager) para implantar e gerenciar recursos na nuvem. Você deseja garantir que os modelos sigam algumas práticas adequadas antes da implantação dos recursos. Use o Kit de Ferramentas de Teste do Modelo do ARM para ajudar você a analisar os modelos, a fim de corrigir qualquer problema.

Configurar o ambiente de teste

A ferramenta é um módulo do PowerShell. Para poder executá-la, use as seguintes etapas:

  • Instalar o módulo do PowerShell. Essa tarefa é feita de maneira diferente de acordo com o sistema operacional em uso: Linux, Mac ou Windows.
  • Baixar o módulo. O módulo é hospedado em um repositório GitHub. Você pode baixá-lo de lá ou buscá-lo por meio de um comando git clone.
  • Importar o módulo. Esta etapa é apenas uma instrução de uma linha que você insere em uma sessão do PowerShell, o que disponibiliza os comandos do ARM-TTK.

Instalar o PowerShell

  1. Para instalar o PowerShell, siga as instruções em Instalar o PowerShell no Linux.

  2. Execute pwsh no terminal para verificar a instalação:

    pwsh
    

    A saída será semelhante a esta:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    

Baixar o kit de ferramentas de teste

O kit de ferramentas de teste está localizado em um repositório GitHub. Escolha uma das seguintes ações:

Inspecionar o kit de ferramentas de teste

Você acabou de baixar o kit de ferramentas de teste para um diretório de sua escolha. Vamos dar uma olhada na sua estrutura de diretório. (Descompacte o arquivo se você optou por baixar o arquivo .zip em vez de executar o comando git clone.) Você terá uma estrutura de diretório semelhante à seguinte se acessar o diretório do kit de ferramentas de teste do ARM:

-| arm-ttk/
-| unit-tests/
-| CODE_OF_CONDUCT.md
-| LICENCE.md
-| README.md
-| SECURITY.md

O kit de ferramentas de teste está localizado no subdiretório /arm-ttk.

Criar o arquivo de modelo

Escolha um diretório e crie um arquivo chamado azuredeploy.json.

Aviso

Verifique se o diretório selecionado está vazio, sem subdiretórios.

Dê a ele o seguinte conteúdo:

   {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
         "location": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]",
            "metadata": {
               "description": "Location for the resources."
            }
         }
      },
      "resources": [{
         "location": "westus"
      }]
   }

Anote a localização do arquivo de modelo. Execute o comando pwd no terminal para gerar o caminho. Você usará esse caminho posteriormente como um parâmetro ao executar o kit de ferramentas de teste.

Detectar e corrigir problemas no modelo executando o kit de ferramentas de teste

Recomendamos que você inicie o Visual Studio Code e um terminal integrado.

Você executará o kit de ferramentas de teste em um caminho que contém um modelo de implantação e corrigirá quaisquer erros detectados alterando o modelo.

Aviso

Neste exercício, você examinará um arquivo de modelo. O kit de ferramentas de teste examina todos os arquivos abaixo do diretório especificado. Ele faz isso porque uma implantação pode conter vários arquivos. Verifique se não há nenhum arquivo JSON abaixo do diretório em que azuredeploy.json se encontra.

  1. Em um terminal, acesse o caminho em que o arquivo azuredeploy.json reside. Execute o seguinte comando para iniciar o Visual Studio Code:

    code .
    

    Observação

    Abra o Visual Studio Code manualmente e o diretório do modelo se o Visual Studio Code não estiver no caminho.

  2. No Visual Studio Code, abra o terminal integrado selecionando Terminal>Novo Terminal no menu superior. Execute o seguinte comando no terminal para iniciar um shell do PowerShell:

    pwsh
    

    Você verá uma saída semelhante a esta:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    

Analisar o modelo

  1. Execute Import-Module para executar os testes em qualquer lugar.

    Observação

    Antes de importar o módulo, substitua path/to/arm-ttk/arm-ttk.psd1 pelo caminho para o kit de ferramentas de teste baixado.

    Import-Module path/to/arm-ttk/arm-ttk.psd1
    

    Dica

    Se você baixou ou clonou a ferramenta no diretório Downloads, o caminho é semelhante a: /Users/<user>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1.

    Agora você está pronto para usar a ferramenta. Desde que você esteja na mesma sessão do PowerShell, não há necessidade de executar o comando de importação novamente.

  2. Execute Test-AzTemplate com o parâmetro -TemplatePath que aponta para a localização do caminho do arquivo de modelo (excluindo o nome de arquivo):

    Test-AzTemplate -TemplatePath .
    

    Você verá uma saída semelhante à seguinte no terminal:

     Validating deploy\azuredeploy.json
       deploymentTemplate
         [+] adminUsername Should Not Be A Literal (4 ms)
         [+] apiVersions Should Be Recent (2 ms)
         [+] artifacts parameter (1 ms)
         [+] DependsOn Best Practices (2 ms)
         [+] Deployment Resources Must Not Be Debug (2 ms)
         [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms)
         [+] DeploymentTemplate Schema Is Correct (1 ms)
         [+] Dynamic Variable References Should Not Use Concat (1 ms)
         [+] IDs Should Be Derived From ResourceIDs (3 ms)
         [+] Location Should Not Be Hardcoded (1 ms)
         [+] ManagedIdentityExtension must not be used (2 ms)
         [+] Min And Max Value Are Numbers (1 ms)
         [+] Outputs Must Not Contain Secrets (4 ms)
         [-] Parameters Must Be Referenced (2 ms)
             Unreferenced parameter: location
    
         [+] Parameters Property Must Exist (1 ms)
         [+] providers apiVersions Is Not Permitted (1 ms)
         [+] ResourceIds should not contain (1 ms)
         [-] Resources Should Have Location (8 ms)
             Resource Location must be an expression or 'global'
    
         [+] Secure String Parameters Cannot Have Default (1 ms)
         [+] Template Should Not Contain Blanks (1 ms)
         [+] Variables Must Be Referenced (1 ms)
         [+] Virtual Machines Should Not Be Preview (3 ms)
         [+] VM Images Should Use Latest Version (1 ms)
         [+] VM Size Should Be A Parameter (3 ms)
    

    Na saída, observe como dois testes estão com falha: Os Recursos Devem ter Localização e Os Parâmetros Devem ser Referenciados. O prefixo [-] indica um teste com falha.

    Para entender o que está acontecendo, abra o arquivo azuredeploy.json. Ele deverá ser parecido com:

    {
       "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
       "contentVersion": "1.0.0.0",
       "parameters": {
          "location": {
             "type": "string",
             "defaultValue": "[resourceGroup().location]",
             "metadata": {
                "description": "Location for the resources."
             }
          }
       },
       "resources": [{
          "location": "westus"
       }]
    }
    

    Os testes estão falhando por dois motivos:

    • O parâmetro location não é usado. Essa mensagem de erro pode, por exemplo, indicar que usamos o parâmetro no passado e esquecemos de limpá-lo. Ou, então, que ele deve ser usado, mas esquecemos de atualizar o código.
    • A propriedade de localização está definida como a cadeia de caracteres westus embutida em código. O uso dessa opção não é considerado uma boa prática, pois o ideal é conseguir controlar a localização de um recurso com parâmetros de entrada durante a implantação.

Aplicar uma correção ao modelo

Como corrigir os testes com falha?

Como o teste indica, podemos tentar substituir westus pelo texto global. No entanto, isso só corrigiria um dos problemas. Provavelmente, o ideal é usar o parâmetro location e definir a localização dos recursos com esse valor.

Há dois motivos para isso. O parâmetro location não só pode ser definido como um parâmetro para implantação, como também tem a alternativa razoável de ser definido para resourceGroup().location como defaultValue caso você omita a configuração do parâmetro location ao executar a implantação.

  1. Localize o primeiro item de recurso na matriz resources e substitua o seguinte conteúdo:

    "resources": [{
      "location": "westus"
    }]
    

    por este conteúdo:

    "resources": [{
      "location": "[parameters('location')]"
    }]
    
  2. Execute a ferramenta de teste no terminal integrado novamente para verificar a correção:

    Test-AzTemplate -TemplatePath .
    

    Agora você obterá uma saída em que todos os testes são aprovados:

    Validating deploy\azuredeploy.json
      deploymentTemplate
        [+] adminUsername Should Not Be A Literal (6 ms)
        [+] apiVersions Should Be Recent (2 ms)
        [+] artifacts parameter (1 ms)
        [+] DependsOn Best Practices (1 ms)
        [+] Deployment Resources Must Not Be Debug (1 ms)
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms)
        [+] DeploymentTemplate Schema Is Correct (1 ms)
        [+] Dynamic Variable References Should Not Use Concat (1 ms)
        [+] IDs Should Be Derived From ResourceIDs (4 ms)
        [+] Location Should Not Be Hardcoded (1 ms)
        [+] ManagedIdentityExtension must not be used (1 ms)
        [+] Min And Max Value Are Numbers (1 ms)
        [+] Outputs Must Not Contain Secrets (1 ms)
        [+] Parameters Must Be Referenced (1 ms)
        [+] Parameters Property Must Exist (1 ms)
        [+] providers apiVersions Is Not Permitted (1 ms)
        [+] ResourceIds should not contain (1 ms)
        [+] Resources Should Have Location (1 ms)
        [+] Secure String Parameters Cannot Have Default (1 ms)
        [+] Template Should Not Contain Blanks (1 ms)
        [+] Variables Must Be Referenced (1 ms)
        [+] Virtual Machines Should Not Be Preview (4 ms)
        [+] VM Images Should Use Latest Version (1 ms)
        [+] VM Size Should Be A Parameter (4 ms)
    

Êxito! Você executou a ferramenta de teste, localizou erros e os corrigiu.

  1. Siga as instruções descritas em Instalar o PowerShell no macOS.

  2. Execute pwsh no terminal para verificar a instalação:

    pwsh
    

    A saída será semelhante a esta:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    

Baixar o kit de ferramentas de teste

O kit de ferramentas de teste está localizado em um repositório GitHub. Escolha uma das seguintes ações:

Inspecionar o kit de ferramentas de teste

Você acabou de baixar o kit de ferramentas de teste para um diretório de sua escolha. Vamos dar uma olhada na sua estrutura de diretório. (Descompacte o arquivo se você optou por baixar o arquivo .zip em vez de executar o comando git clone.) Você terá uma estrutura de diretório semelhante à seguinte se acessar o diretório do kit de ferramentas de teste do ARM:

-| arm-ttk/
-| unit-tests/
-| CODE_OF_CONDUCT.md
-| LICENCE.md
-| README.md
-| SECURITY.md

O kit de ferramentas de teste está localizado no subdiretório /arm-ttk.

Criar o arquivo de modelo

Escolha um diretório e crie um arquivo chamado azuredeploy.json.

Aviso

Verifique se o diretório selecionado está vazio, sem subdiretórios.

Dê a ele o seguinte conteúdo:

{
   "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {
      "location": {
         "type": "string",
         "defaultValue": "[resourceGroup().location]",
         "metadata": {
            "description": "Location for the resources."
         }
      }
   },
   "resources": [{
      "location": "westus"
   }]
}

Anote a localização do arquivo de modelo. Execute o comando pwd no terminal para gerar o caminho. Você usará esse caminho posteriormente como um parâmetro ao executar o kit de ferramentas de teste.

Detectar e corrigir problemas no modelo executando o kit de ferramentas de teste

Recomendamos que você inicie o Visual Studio Code e um terminal integrado.

Você executará o kit de ferramentas de teste em um caminho que contém um modelo de implantação e corrigirá quaisquer erros detectados alterando o modelo.

Aviso

Neste exercício, você examinará um arquivo de modelo. O kit de ferramentas de teste examina todos os arquivos abaixo do diretório especificado. Ele faz isso porque uma implantação pode conter vários arquivos. Verifique se não há nenhum arquivo JSON abaixo do diretório em que azuredeploy.json se encontra.

  1. Em um terminal, acesse o caminho em que o arquivo azuredeploy.json reside. Execute o seguinte comando para iniciar o Visual Studio Code:

    code .
    

    Observação

    Abra o Visual Studio Code manualmente e o diretório do modelo se o Visual Studio Code não estiver no caminho.

  2. No Visual Studio Code, abra o terminal integrado selecionando Terminal>Novo Terminal no menu superior. Execute o seguinte comando no terminal para iniciar um shell do PowerShell:

    pwsh
    

    Você verá uma saída semelhante a esta:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    

Analisar o modelo

  1. Execute Import-Module para executar os testes em qualquer lugar.

    Observação

    Antes de importar o módulo, substitua path/to/arm-ttk/arm-ttk.psd1 pelo caminho para o kit de ferramentas de teste baixado.

    Import-Module path/to/arm-ttk/arm-ttk.psd1
    

    Dica

    Se você baixou ou clonou a ferramenta no diretório Downloads, o caminho é semelhante a: /Users/<user>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1.

    Agora você está pronto para usar a ferramenta. Desde que você esteja na mesma sessão do PowerShell, não há necessidade de executar o comando de importação novamente.

  2. Execute Test-AzTemplate com o parâmetro -TemplatePath que aponta para a localização do caminho do arquivo de modelo (excluindo o nome de arquivo):

    Test-AzTemplate -TemplatePath .
    

    Você verá uma saída semelhante à seguinte no terminal:

    Validating deploy\azuredeploy.json
      deploymentTemplate
        [+] adminUsername Should Not Be A Literal (4 ms)
        [+] apiVersions Should Be Recent (2 ms)
        [+] artifacts parameter (1 ms)
        [+] DependsOn Best Practices (2 ms)
        [+] Deployment Resources Must Not Be Debug (2 ms)
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms)
        [+] DeploymentTemplate Schema Is Correct (1 ms)
        [+] Dynamic Variable References Should Not Use Concat (1 ms)
        [+] IDs Should Be Derived From ResourceIDs (3 ms)
        [+] Location Should Not Be Hardcoded (1 ms)
        [+] ManagedIdentityExtension must not be used (2 ms)
        [+] Min And Max Value Are Numbers (1 ms)
        [+] Outputs Must Not Contain Secrets (4 ms)
        [-] Parameters Must Be Referenced (2 ms)
            Unreferenced parameter: location
    
        [+] Parameters Property Must Exist (1 ms)
        [+] providers apiVersions Is Not Permitted (1 ms)
        [+] ResourceIds should not contain (1 ms)
        [-] Resources Should Have Location (8 ms)
            Resource Location must be an expression or 'global'
    
        [+] Secure String Parameters Cannot Have Default (1 ms)
        [+] Template Should Not Contain Blanks (1 ms)
        [+] Variables Must Be Referenced (1 ms)
        [+] Virtual Machines Should Not Be Preview (3 ms)
        [+] VM Images Should Use Latest Version (1 ms)
        [+] VM Size Should Be A Parameter (3 ms)
    

    A saída anterior mostra como dois testes estão falhando: Os Recursos Devem ter Localização e Os Parâmetros Devem ser Referenciados. O prefixo [-] indica um teste com falha.

    Para entender o que está acontecendo, abra o arquivo azuredeploy.json. Ele deverá ser parecido com:

    {
       "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
       "contentVersion": "1.0.0.0",
       "parameters": {
          "location": {
             "type": "string",
             "defaultValue": "[resourceGroup().location]",
             "metadata": {
                "description": "Location for the resources."
             }
          }
       },
       "resources": [{
          "location": "westus"
       }]
    }
    

    Os testes estão falhando por dois motivos:

    • O parâmetro location não é usado. Essa mensagem de erro pode, por exemplo, indicar que usamos o parâmetro no passado e esquecemos de limpá-lo. Ou, então, que ele deve ser usado, mas esquecemos de atualizar o código.
    • A propriedade de localização está definida como a cadeia de caracteres westus embutida em código. O uso dessa opção não é considerado uma boa prática, pois o ideal é conseguir controlar a localização de um recurso com parâmetros de entrada durante a implantação.

Aplicar uma correção ao modelo

Como corrigir os testes com falha?

Como o teste indica, podemos tentar substituir westus pelo texto global. No entanto, isso só corrigiria um dos problemas. Provavelmente, o ideal é usar o parâmetro location e definir a localização dos recursos com esse valor.

Há dois motivos para isso. O parâmetro location não só pode ser definido como um parâmetro para implantação, como também tem a alternativa razoável de ser definido para resourceGroup().location como defaultValue caso você omita a configuração do parâmetro location ao executar a implantação.

  1. Localize o primeiro item de recurso na matriz resources e substitua o seguinte conteúdo:

    "resources": [{
      "location": "westus"
    }]
    

    por este conteúdo:

    "resources": [{
      "location": "[parameters('location')]"
    }]
    
  2. Execute a ferramenta de teste no terminal integrado novamente para verificar a correção:

    Test-AzTemplate -TemplatePath .
    

    Agora você obterá uma saída em que todos os testes são aprovados:

    Validating deploy\azuredeploy.json
      deploymentTemplate
        [+] adminUsername Should Not Be A Literal (6 ms)
        [+] apiVersions Should Be Recent (2 ms)
        [+] artifacts parameter (1 ms)
        [+] DependsOn Best Practices (1 ms)
        [+] Deployment Resources Must Not Be Debug (1 ms)
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms)
        [+] DeploymentTemplate Schema Is Correct (1 ms)
        [+] Dynamic Variable References Should Not Use Concat (1 ms)
        [+] IDs Should Be Derived From ResourceIDs (4 ms)
        [+] Location Should Not Be Hardcoded (1 ms)
        [+] ManagedIdentityExtension must not be used (1 ms)
        [+] Min And Max Value Are Numbers (1 ms)
        [+] Outputs Must Not Contain Secrets (1 ms)
        [+] Parameters Must Be Referenced (1 ms)
        [+] Parameters Property Must Exist (1 ms)
        [+] providers apiVersions Is Not Permitted (1 ms)
        [+] ResourceIds should not contain (1 ms)
        [+] Resources Should Have Location (1 ms)
        [+] Secure String Parameters Cannot Have Default (1 ms)
        [+] Template Should Not Contain Blanks (1 ms)
        [+] Variables Must Be Referenced (1 ms)
        [+] Virtual Machines Should Not Be Preview (4 ms)
        [+] VM Images Should Use Latest Version (1 ms)
        [+] VM Size Should Be A Parameter (4 ms)
    

Êxito! Você executou a ferramenta de teste, localizou erros e os corrigiu.

  1. Siga as instruções descritas em Instalar o PowerShell no Windows.
  2. No Visual Studio Code, instale a extensão do PowerShell.

Baixar o kit de ferramentas de teste

O kit de ferramentas de teste está localizado em um repositório GitHub. Escolha uma das seguintes ações:

Inspecionar o kit de ferramentas de teste

Você acabou de baixar o kit de ferramentas de teste para um diretório de sua escolha. Vamos dar uma olhada na sua estrutura de diretório. (Descompacte o arquivo se você optou por baixar o arquivo .zip em vez de executar o comando git clone.) Você terá uma estrutura de diretório semelhante à seguinte se acessar o diretório do kit de ferramentas de teste do ARM:

-| arm-ttk\
-| unit-tests\
-| CODE_OF_CONDUCT.md
-| LICENCE.md
-| README.md
-| SECURITY.md

O kit de ferramentas de teste está localizado no subdiretório \arm-ttk.

Criar o arquivo de modelo

Crie um arquivo chamado azuredeploy.json em um diretório de sua escolha, como C:\Temp.

Aviso

Verifique se o diretório selecionado está vazio, sem subdiretórios.

Dê a ele o seguinte conteúdo:

{
   "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {
      "location": {
         "type": "string",
         "defaultValue": "[resourceGroup().location]",
         "metadata": {
            "description": "Location for the resources."
         }
      }
   },
   "resources": [{
      "location": "westus"
   }]
}

Anote a localização do arquivo de modelo. Você usará esse caminho de diretório (por exemplo, C:\Temp) posteriormente como um parâmetro ao executar o kit de ferramentas de teste.

Detectar e corrigir problemas no modelo executando o kit de ferramentas de teste

Recomendamos que você inicie o Visual Studio Code e um terminal integrado.

Você executará o kit de ferramentas de teste em um caminho que contém um modelo de implantação e corrigirá quaisquer erros detectados alterando o modelo.

Aviso

Neste exercício, você examinará um arquivo de modelo. O kit de ferramentas de teste examina todos os arquivos abaixo do diretório especificado. Ele faz isso porque uma implantação pode conter vários arquivos. Verifique se não há nenhum arquivo JSON abaixo do diretório em que azuredeploy.json se encontra.

  1. Em um terminal, acesse o caminho em que o arquivo azuredeploy.json reside. Execute o seguinte comando para iniciar o Visual Studio Code:

    code .
    

    Observação

    Abra o Visual Studio Code manualmente e o diretório do modelo se o Visual Studio Code não estiver no caminho.

  2. No Visual Studio Code, abra a paleta de comandos e selecione o comando PowerShell: Mostrar Console Integrado.

Analisar o modelo

  1. Execute Import-Module no terminal do PowerShell:

    Observação

    Antes de importar o módulo, substitua path\to\arm-ttk\arm-ttk.psd1 pelo caminho para o kit de ferramentas de teste baixado.

    Import-Module path\to\arm-ttk\arm-ttk.psd1
    

    O comando anterior indicará a posição do módulo do kit de ferramentas de teste.

    Dica

    Se você baixou ou clonou a ferramenta no diretório Downloads, o caminho é semelhante a: C:\Users\<user>\Downloads\arm-ttk\arm-ttk\arm-ttk.psd1.

    Agora você está pronto para usar a ferramenta. Desde que você esteja na mesma sessão do PowerShell, não há necessidade de executar o comando de importação novamente.

    Observação

    Se você iniciar uma nova sessão do PowerShell, precisará executar o comando Import-Module novamente.

  2. Execute Test-AzTemplate no terminal do PowerShell para iniciar uma execução de teste:

    Test-AzTemplate -TemplatePath .
    

    Você verá uma saída semelhante à seguinte no terminal:

    Validating deploy\azuredeploy.json
      JSONFiles Should Be Valid
        [+] JSONFiles Should Be Valid (16 ms)
    Fail  : 0
    Total : 1
    Pass  : 1
    
    
    
      adminUsername Should Not Be A Literal
        [+] adminUsername Should Not Be A Literal (6 ms)
      apiVersions Should Be Recent In Reference Functions
        [+] apiVersions Should Be Recent In Reference Functions (10 ms)
      apiVersions Should Be Recent
        [+] apiVersions Should Be Recent (7 ms)
      artifacts parameter
        [+] artifacts parameter (5 ms)
      CommandToExecute Must Use ProtectedSettings For Secrets
        [+] CommandToExecute Must Use ProtectedSettings For Secrets (7 ms)
      DependsOn Best Practices
        [+] DependsOn Best Practices (6 ms)
      Deployment Resources Must Not Be Debug
        [+] Deployment Resources Must Not Be Debug (5 ms)
      DeploymentTemplate Must Not Contain Hardcoded Uri
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (5 ms)
      DeploymentTemplate Schema Is Correct
        [+] DeploymentTemplate Schema Is Correct (4 ms)
      Dynamic Variable References Should Not Use Concat
        [+] Dynamic Variable References Should Not Use Concat (4 ms)
      IDs Should Be Derived From ResourceIDs
        [+] IDs Should Be Derived From ResourceIDs (6 ms)
      deploymentTemplate
        [-] Location Should Not Be Hardcoded (13 ms)
            Location value of 'westus' on resource '' must be an expression or 'global'. Line: 14, Column: 9    
    
      ManagedIdentityExtension must not be used
        [+] ManagedIdentityExtension must not be used (5 ms)
      Min And Max Value Are Numbers
        [+] Min And Max Value Are Numbers (5 ms)
      Outputs Must Not Contain Secrets
        [+] Outputs Must Not Contain Secrets (5 ms)
      Parameter Types Should Be Consistent
        [+] Parameter Types Should Be Consistent (9 ms)
      deploymentTemplate
        [-] Parameters Must Be Referenced (6 ms)
            Unreferenced parameter: location Line: 5, Column: 9
    
      Password params must be secure
        [+] Password params must be secure (11 ms)
      providers apiVersions Is Not Permitted
        [+] providers apiVersions Is Not Permitted (5 ms)
      ResourceIds should not contain
        [+] ResourceIds should not contain (5 ms)
      deploymentTemplate
        [-] Resources Should Have Location (5 ms)
            Resource  Location must be an expression or 'global'
    
      Resources Should Not Be Ambiguous
        [+] Resources Should Not Be Ambiguous (7 ms)
      Secure Params In Nested Deployments
        [+] Secure Params In Nested Deployments (10 ms)
      Secure String Parameters Cannot Have Default
        [+] Secure String Parameters Cannot Have Default (7 ms)
      Template Should Not Contain Blanks
        [+] Template Should Not Contain Blanks (5 ms)
      URIs Should Be Properly Constructed
        [+] URIs Should Be Properly Constructed (8 ms)
      Variables Must Be Referenced
        [+] Variables Must Be Referenced (5 ms)
      Virtual Machines Should Not Be Preview
        [+] Virtual Machines Should Not Be Preview (8 ms)
      VM Images Should Use Latest Version
        [+] VM Images Should Use Latest Version (5 ms)
      VM Size Should Be A Parameter
        [+] VM Size Should Be A Parameter (5 ms)
    Fail  : 3
    Total : 31
    Pass  : 28
    

    A saída anterior mostra as falhas de três testes: O local não precisa ser codificado, Os parâmetros precisam ser referenciados e Os recursos precisam ter um local. O prefixo [-] indica um teste com falha.

    Para entender o que está acontecendo, abra o arquivo azuredeploy.json. Ele deverá ser parecido com:

    {
       "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
       "contentVersion": "1.0.0.0",
       "parameters": {
          "location": {
             "type": "string",
             "defaultValue": "[resourceGroup().location]",
             "metadata": {
                "description": "Location for the resources."
             }
          }
       },
       "resources": [{
          "location": "westus"
       }]
    }
    

    Os testes estão falhando por dois motivos:

    • O parâmetro location não é usado. Essa mensagem de erro pode, por exemplo, indicar que usamos o parâmetro no passado e esquecemos de limpá-lo. Ou, então, que ele deve ser usado, mas esquecemos de atualizar o código.
    • A propriedade de localização está definida como a cadeia de caracteres westus embutida em código. O uso dessa opção não é considerado uma boa prática, pois o ideal é conseguir controlar a localização de um recurso com parâmetros de entrada durante a implantação.

Aplicar uma correção ao modelo

Como corrigir os testes com falha?

Como o teste indica, podemos tentar substituir westus pelo texto global. No entanto, isso só corrigiria um dos problemas. Provavelmente, o ideal é usar o parâmetro location e definir a localização dos recursos com esse valor.

Há dois motivos para isso. O parâmetro location não só pode ser definido como um parâmetro para implantação, como também tem a alternativa razoável de ser definido para resourceGroup().location como defaultValue caso você omita a configuração do parâmetro location ao executar a implantação.

  1. Localize o primeiro item de recurso na matriz resources e substitua o seguinte conteúdo:

    "resources": [{
       "location": "westus"
    }]
    

    por este conteúdo:

    "resources": [{
       "location": "[parameters('location')]"
    }]
    
  2. Execute Test-AzTemplate para executar a ferramenta de teste novamente:

    Test-AzTemplate -TemplatePath .
    

    Agora você obterá uma saída em que todos os testes são aprovados:

    Validating deploy\azuredeploy.json
      JSONFiles Should Be Valid
        [+] JSONFiles Should Be Valid (83 ms)
    Fail  : 0
    Total : 1
    Pass  : 1
    
    
    
      adminUsername Should Not Be A Literal
        [+] adminUsername Should Not Be A Literal (36 ms)
      apiVersions Should Be Recent In Reference Functions
        [+] apiVersions Should Be Recent In Reference Functions (57 ms)
      piVersions Should Be Recent
        [+] apiVersions Should Be Recent (67 ms)
      artifacts parameter
        [+] artifacts parameter (19 ms)
      CommandToExecute Must Use ProtectedSettings For Secrets
        [+] CommandToExecute Must Use ProtectedSettings For Secrets (93 ms)
      DependsOn Best Practices
        [+] DependsOn Best Practices (52 ms)
      Deployment Resources Must Not Be Debug
        [+] Deployment Resources Must Not Be Debug (77 ms)
      DeploymentTemplate Must Not Contain Hardcoded Uri
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (18 ms)
      DeploymentTemplate Schema Is Correct
        [+] DeploymentTemplate Schema Is Correct (73 ms)
      Dynamic Variable References Should Not Use Concat
        [+] Dynamic Variable References Should Not Use Concat (72 ms)
      IDs Should Be Derived From ResourceIDs
        [+] IDs Should Be Derived From ResourceIDs (15 ms)
      Location Should Not Be Hardcoded
        [+] Location Should Not Be Hardcoded (24 ms)
      ManagedIdentityExtension must not be used
        [+] ManagedIdentityExtension must not be used (143 ms)
      Min And Max Value Are Numbers
        [+] Min And Max Value Are Numbers (23 ms)
      Outputs Must Not Contain Secrets
        [+] Outputs Must Not Contain Secrets (160 ms)
      Parameter Types Should Be Consistent
        [+] Parameter Types Should Be Consistent (13 ms)
      Parameters Must Be Referenced
        [+] Parameters Must Be Referenced (13 ms)
      Password params must be secure
        [+] Password params must be secure (12 ms)
      providers apiVersions Is Not Permitted
        [+] providers apiVersions Is Not Permitted (79 ms)
      ResourceIds should not contain
        [+] ResourceIds should not contain (12 ms)
      Resources Should Have Location
        [+] Resources Should Have Location (17 ms)
      Resources Should Not Be Ambiguous
        [+] Resources Should Not Be Ambiguous (17 ms)
      Secure Params In Nested Deployments
        [+] Secure Params In Nested Deployments (17 ms)
      Secure String Parameters Cannot Have Default
        [+] Secure String Parameters Cannot Have Default (16 ms)
      Template Should Not Contain Blanks
        [+] Template Should Not Contain Blanks (83 ms)
      URIs Should Be Properly Constructed
        [+] URIs Should Be Properly Constructed (108 ms)
      Variables Must Be Referenced
        [+] Variables Must Be Referenced (111 ms)
      Virtual Machines Should Not Be Preview
        [+] Virtual Machines Should Not Be Preview (16 ms)
      VM Images Should Use Latest Version
        [+] VM Images Should Use Latest Version (22 ms)
      VM Size Should Be A Parameter
        [+] VM Size Should Be A Parameter (133 ms)
    Fail  : 0
    Total : 31
    Pass  : 31   
    

Êxito! Você executou a ferramenta de teste, localizou erros e os corrigiu.

Agora você está pronto para executar os testes no seu modelo.