Exercício - Aplique boas práticas ao seu modelo usando o ARM Template Test Toolkit

Concluído

Faz parte de uma equipa de programação na empresa Tailwind Traders. Como parte do seu trabalho, tem de criar modelos do Azure Resource Manager (ARM) para implementar e gerir recursos na cloud. Você deseja garantir que os modelos sigam algumas práticas sólidas antes que os recursos sejam implantados. Você opta por usar o ARM Template Test Toolkit para ajudá-lo a analisar seus modelos, para que possa corrigir quaisquer problemas.

Configurar o ambiente de teste

A ferramenta é um módulo do PowerShell. Para poder executá-la, utilize os seguintes passos:

  • Instale o módulo PowerShell. Esta tarefa varia consoante tenha Linux, Mac ou Windows.
  • Faça o download do módulo. O módulo está hospedado em um repositório GitHub. Pode transferi-lo daí ou obtê-lo através de um comando git clone.
  • Importe o módulo. Esta etapa é apenas uma instrução de uma linha que você insere em uma sessão do PowerShell que disponibilizará os comandos ARM-TTK.

Instalar o PowerShell

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

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

    pwsh
    

    A saída é semelhante ao seguinte:

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

Transferir o toolkit de testes

O toolkit de testes encontra-se num repositório GitHub. Escolha uma das seguintes ações:

Analisar o toolkit de testes

Acabou de transferir o toolkit de testes para um diretório escolhido por si. Vejamos a sua estrutura de diretórios. (Certifique-se de ter descompactado o arquivo se optou por baixar o arquivo .zip em vez de executar o git clone comando.) Você deve ter uma estrutura de diretórios parecida com a seguinte se você for para o diretório do kit de ferramentas de teste ARM:

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

O toolkit de testes encontra-se no subdiretório /arm-ttk.

Criar o ficheiro de modelo

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

Aviso

Verifique se o diretório selecionado está vazio e não tem subdiretórios.

Adicione os seguintes conteúdos ao mesmo:

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

Tome nota da localização do ficheiro de modelo. Pode executar 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.

Detetar e corrigir problemas no seu modelo ao executar o toolkit de testes

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

Irá executar o toolkit de testes num caminho com um modelo de implementação e corrigir eventuais erros que detete ao alterar o modelo.

Aviso

Neste exercício, irá analisar um ficheiro de modelo. O toolkit de testes analisa todos os ficheiros abaixo do diretório que especificar. Isto acontece porque uma implementação pode conter vários ficheiros. Certifique-se de que não existem ficheiros JSON abaixo do diretório em que se encontra o azuredeploy.json.

  1. Num terminal, aceda ao caminho em que reside o seu ficheiro azuredeploy.json. Execute o seguinte comando para iniciar o Visual Studio Code:

    code .
    

    Nota

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

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

    pwsh
    

    Vê um resultado semelhante ao seguinte:

    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 poder executar testes em qualquer lugar.

    Nota

    Antes de importar o módulo, substitua path/to/arm-ttk/arm-ttk.psd1 pelo caminho para o toolkit de testes transferido.

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

    Gorjeta

    Se você baixou ou clonou a ferramenta para o diretório de Downloads, o caminho ficaria assim: /Users/user>/Downloads/arm-ttk/arm-ttk/<arm-ttk.psd1.

    Agora, está pronto para utilizar a ferramenta. Desde que esteja na mesma sessão do PowerShell, não terá de voltar a executar o comando de importação.

  2. Execute Test-AzTemplate com o parâmetro -TemplatePath apontando para o local do caminho do arquivo de modelo (excluindo o nome do arquivo):

    Test-AzTemplate -TemplatePath .
    

    Verá um resultado semelhante ao 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 falhando: Os recursos devem ter localização e os parâmetros devem ser referenciados. O prefixo [-] indica um teste com falha.

    Para saber o que se passa, abra o ficheiro azuredeploy.json. Deverá ter o seguinte aspeto:

    {
       "$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 a falhar por dois motivos:

    • O parâmetro de localização não é utilizado. Esta mensagem de erro pode, por exemplo, indicar que utilizámos o parâmetro anteriormente e nos esquecemos de o eliminar. Pode também indicar que deve ser utilizado, mas que nos esquecemos de atualizar o nosso código.
    • A propriedade de localização está definida na cadeia codificada westus. A utilização desta opção não é considerada boa prática porque quer poder controlar a localização de um recurso com os parâmetros de entrada durante a implementação.

Aplicar uma correção ao modelo

Como corrigimos os testes com falha?

Como indicado no teste, podemos tentar substituir westus pelo texto global. No entanto, isto apenas corrige um dos problemas. O mais provável é querermos utilizar o parâmetro location e definir a localização do recurso como esse valor.

Existem dois motivos para tal: O parâmetro location não só pode ser definido como um parâmetro para implantação, mas também tem o fallback razoável de ser definido como resourceGroup().location como defaultValue se você omitir 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 .
    

    Obtém agora um resultado em que todos os testes passam:

    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! Executou a ferramenta de teste, localizou erros e corrigiu-os.

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

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

    pwsh
    

    A saída é semelhante ao seguinte:

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

Transferir o Toolkit de testes

O toolkit de testes encontra-se num repositório GitHub. Escolha uma das seguintes ações:

Analisar o toolkit de testes

Acabou de transferir o toolkit de testes para um diretório escolhido por si. Vejamos a sua estrutura de diretórios. (Certifique-se de ter descompactado o arquivo se optou por baixar o arquivo .zip em vez de executar o git clone comando.) Você deve ter uma estrutura de diretórios parecida com a seguinte se você for para o diretório do kit de ferramentas de teste ARM:

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

O toolkit de testes encontra-se no subdiretório /arm-ttk.

Criar o ficheiro de modelo

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

Aviso

Verifique se o diretório selecionado está vazio e não tem subdiretórios.

Adicione os seguintes conteúdos ao mesmo:

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

Tome nota da localização do ficheiro de modelo. Pode executar 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.

Detetar e corrigir problemas no seu modelo ao executar o toolkit de testes

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

Irá executar o toolkit de testes num caminho com um modelo de implementação e corrigir eventuais erros que detete ao alterar o modelo.

Aviso

Neste exercício, irá analisar um ficheiro de modelo. O toolkit de testes analisa todos os ficheiros abaixo do diretório que especificar. Isto acontece porque uma implementação pode conter vários ficheiros. Certifique-se de que não existem ficheiros JSON abaixo do diretório em que se encontra o azuredeploy.json.

  1. Num terminal, aceda ao caminho em que reside o seu ficheiro azuredeploy.json. Execute o seguinte comando para iniciar o Visual Studio Code:

    code .
    

    Nota

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

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

    pwsh
    

    Vê um resultado semelhante ao seguinte:

    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 poder executar testes em qualquer lugar.

    Nota

    Antes de importar o módulo, substitua path/to/arm-ttk/arm-ttk.psd1 pelo caminho para o toolkit de testes transferido.

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

    Gorjeta

    Se você baixou ou clonou a ferramenta para o diretório de Downloads, o caminho ficaria assim: /Users/user>/Downloads/arm-ttk/arm-ttk/<arm-ttk.psd1.

    Agora, está pronto para utilizar a ferramenta. Desde que esteja na mesma sessão do PowerShell, não terá de voltar a executar o comando de importação.

  2. Execute Test-AzTemplate com o parâmetro -TemplatePath apontando para o local do caminho do arquivo de modelo (excluindo o nome do arquivo):

    Test-AzTemplate -TemplatePath .
    

    Verá um resultado semelhante ao 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 saber o que se passa, abra o ficheiro azuredeploy.json. Deverá ter o seguinte aspeto:

    {
       "$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 a falhar por dois motivos:

    • O parâmetro de localização não é utilizado. Esta mensagem de erro pode, por exemplo, indicar que utilizámos o parâmetro anteriormente e nos esquecemos de o eliminar. Pode também indicar que deve ser utilizado, mas que nos esquecemos de atualizar o nosso código.
    • A propriedade de localização está definida na cadeia codificada westus. A utilização desta opção não é considerada boa prática porque quer poder controlar a localização de um recurso com os parâmetros de entrada durante a implementação.

Aplicar uma correção ao modelo

Como corrigimos os testes com falha?

Como indicado no teste, podemos tentar substituir westus pelo texto global. No entanto, isto apenas corrige um dos problemas. O mais provável é querermos utilizar o parâmetro location e definir a localização do recurso como esse valor.

Existem dois motivos para tal: O parâmetro location não só pode ser definido como um parâmetro para implantação, mas também tem o fallback razoável de ser definido como resourceGroup().location como defaultValue se você omitir 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 .
    

    Obtém agora um resultado em que todos os testes passam:

    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! Executou a ferramenta de teste, localizou erros e corrigiu-os.

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

Transferir o toolkit de testes

O toolkit de testes encontra-se num repositório GitHub. Escolha uma das seguintes ações:

Analisar o toolkit de testes

Acabou de transferir o toolkit de testes para um diretório escolhido por si. Vejamos a sua estrutura de diretórios. (Certifique-se de ter descompactado o arquivo se optou por baixar o arquivo .zip em vez de executar o git clone comando.) Você deve ter uma estrutura de diretórios parecida com a seguinte se você for para o diretório do kit de ferramentas de teste ARM:

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

O toolkit de testes encontra-se no subdiretório \arm-ttk.

Criar o ficheiro de modelo

Crie um ficheiro chamado azuredeploy.json num diretório à sua escolha, como C:\Temp.

Aviso

Verifique se o diretório selecionado está vazio e não tem subdiretórios.

Adicione os seguintes conteúdos ao mesmo:

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

Tome nota da localização do ficheiro 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.

Detetar e corrigir problemas no seu modelo ao executar o toolkit de testes

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

Irá executar o toolkit de testes num caminho com um modelo de implementação e corrigir eventuais erros que detete ao alterar o modelo.

Aviso

Neste exercício, irá analisar um ficheiro de modelo. O toolkit de testes analisa todos os ficheiros abaixo do diretório que especificar. Isto acontece porque uma implementação pode conter vários ficheiros. Certifique-se de que não existem ficheiros JSON abaixo do diretório em que se encontra o azuredeploy.json.

  1. Num terminal, aceda ao caminho em que reside o seu ficheiro azuredeploy.json. Execute o seguinte comando para iniciar o Visual Studio Code:

    code .
    

    Nota

    Abra o Visual Studio Code manualmente e abra o diretório de 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: Show Integrated Console.

Analisar o modelo

  1. Execute Import-Module no terminal do PowerShell:

    Nota

    Antes de importar o módulo, substitua path\to\arm-ttk\arm-ttk.psd1 pelo caminho para o toolkit de testes transferido.

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

    O comando anterior indica a posição do módulo do toolkit de testes.

    Gorjeta

    Se você baixou ou clonou a ferramenta para o diretório Downloads, o caminho seria parecido com este: C:\Users\user>\Downloads\arm-ttk\arm-ttk\<arm-ttk.psd1.

    Agora, está pronto para utilizar a ferramenta. Desde que esteja na mesma sessão do PowerShell, não terá de voltar a executar o comando de importação.

    Nota

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

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

    Test-AzTemplate -TemplatePath .
    

    Verá um resultado semelhante ao 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 como três testes estão falhando: Localização não deve ser codificada, parâmetros devem ser referenciados e recursos devem ter localização. O prefixo [-] indica um teste com falha.

    Para saber o que se passa, abra o ficheiro azuredeploy.json. Deverá ter o seguinte aspeto:

    {
       "$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 a falhar por dois motivos:

    • O parâmetro de localização não é utilizado. Esta mensagem de erro pode, por exemplo, indicar que utilizámos o parâmetro anteriormente e nos esquecemos de o eliminar. Pode também indicar que deve ser utilizado, mas que nos esquecemos de atualizar o nosso código.
    • A propriedade de localização está definida na cadeia codificada westus. A utilização desta opção não é considerada boa prática porque quer poder controlar a localização de um recurso com os parâmetros de entrada durante a implementação.

Aplicar uma correção ao modelo

Como corrigimos os testes com falha?

Como indicado no teste, podemos tentar substituir westus pelo texto global. No entanto, isto apenas corrige um dos problemas. O mais provável é querermos utilizar o parâmetro location e definir a localização do recurso como esse valor.

Existem dois motivos para tal: O parâmetro location não só pode ser definido como um parâmetro para implantação, mas também tem o fallback razoável de ser definido como resourceGroup().location como defaultValue se você omitir 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 .
    

    Obtém agora um resultado em que todos os testes passam:

    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! Executou a ferramenta de teste, localizou erros e corrigiu-os.

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