練習 - 使用 ARM 範本測試工具組,將良好做法套用到您的範本

已完成

您是 Tailwind Traders 公司開發小組的成員。 作為該工作的一部分,您須撰寫 Azure Resource Manager (ARM) 範本,以在雲端中部署及管理資源。 您想要先確保範本遵循一些良好作法,然後再部署資源。 您選擇使用 ARM 範本測試工具組來協助您分析範本,以便修正任何問題。

設定您的測試環境

該工具為 PowerShell 模組。 若要能夠加以執行,請使用下列步驟:

  • 安裝 PowerShell 模組。 此工作會視您是在 Linux、Mac 或 Windows 上執行,以不同的方式完成。
  • 下載模組。 模組裝載於 GitHub 存放庫。 您可以從該處下載,或透過 git clone 命令加以提取。
  • 匯入模組。 此步驟只是您輸入至 PowerShell 工作階段的單行指示,可讓您使用 ARM TTK 命令。

安裝 PowerShell

  1. 若要安裝 PowerShell,請遵循在 Linux 上安裝 PowerShell 中的指示。

  2. 在終端中執行 pwsh,以驗證安裝:

    pwsh
    

    您的輸出看起來會像這樣:

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

下載測試工具組

測試工具組位於 GitHub 存放庫。 選擇下列其中一個動作:

檢查測試工具組

您剛剛已將測試工具組下載到您所選擇的目錄。 讓我們來看一下您的目錄結構 (如果您選擇下載 .zip 檔案,而不是執行 git clone 命令,請確保您已將檔案解壓縮。) 若您移至 ARM 測試工具組的目錄,應該會看到看起來如下的目錄結構:

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

測試工具組位於 /arm-ttk 子目錄。

建立範本檔案

選擇一個目錄,並建立名為 azuredeploy.json 的檔案。

警告

確定選取的目錄是空的,而且不包含子目錄。

輸入下列內容:

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

記下範本檔案的位置。 您可以在終端中執行 pwd 命令,以輸出路徑。 您稍後將會在執行測試工具組時,使用此路徑作為參數。

透過執行測試工具組來偵測及修正範本中的問題

建議您啟動 Visual Studio Code 與整合式終端。

您將會在包含部署範本的路徑上執行測試工具組,並透過變更範本來修正其偵測到的任何錯誤。

警告

在本練習中,您要掃描一個範本檔案。 測試工具組會掃描您指定之目錄底下的所有檔案。 其原因在於部署可包含許多檔案。 請確認 azuredeploy.json 所在目錄底下,沒有任何 JSON 檔案。

  1. 在終端中,移至您的 azuredeploy.json 檔案所在的路徑。 執行下列命令以啟動 Visual Studio Code:

    code .
    

    注意

    手動開啟 Visual Studio Code,若 Visual Studio Code 不在路徑上,請開啟範本目錄。

  2. 從 Visual Studio Code,選取頂端功能表中的 [終端]>[新增終端],以開啟整合式終端。 在終端機中執行下列命令,以啟動 PowerShell 殼層:

    pwsh
    

    您會看到如下所示的輸出:

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

分析範本

  1. 執行 Import-Module,以便能從任何位置執行測試。

    注意

    在匯入模組之前,請將 path/to/arm-ttk/arm-ttk.psd1 取代為所下載測試工具組的路徑。

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

    提示

    如果已將工具下載或複製到 [下載] 目錄,則路徑看起來會像下面這樣:/Users/<使用者>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1

    現在您已準備就緒,可以開始使用工具。 只要在相同的 PowerShell 工作階段中,就無須再次執行匯入命令。

  2. 使用指向範本檔案路徑位置 (不包括檔案名稱) 的 -TemplatePath 參數,執行 Test-AzTemplate

    Test-AzTemplate -TemplatePath .
    

    您應該會在終端內看到如下的輸出:

     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)
    

    在輸出中,注意兩個測試失敗的情況:資源應具有位置,以及必須參考參數。 前置詞 [-] 表示失敗的測試。

    若要了解發生什麼情況,請開啟 azuredeploy.json 檔案。 其看起來應該如下:

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

    測試失敗的原因有兩個:

    • 未使用 location 參數。 例如,此錯誤訊息可能表示我們先前曾使用過該參數,但忘記進行清理。 或者可能已使用該參數,但我們忘記更新程式碼。
    • The location property is set to the hardcoded string westus (location 屬性已設為硬式編碼字串 westus)。 使用此選項並非良好作法,因為您會想要在部署時,使用輸入參數控制資源位置。

將修正套用至範本

如何修正失敗的測試?

如測試所示,我們可嘗試將 wesus 取代成文字 global。 但是,那樣只會修正其中一個問題。 我們很可能會想要使用 location 參數,並將資源位置設定為該值。

原因有兩個。 location 參數不只可針對部署設定為參數,還會在執行部署期間省略設定 location 時,具備設定 resourceGroup().location 作為 defaultValue 的合理後援。

  1. 找出 resources 陣列中的第一個資源項目,然後將下列內容:

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

    取代為此內容:

    "resources": [{
      "location": "[parameters('location')]"
    }]
    
  2. 在整合式終端中再次執行測試工具,以驗證修正:

    Test-AzTemplate -TemplatePath .
    

    您現在會取得所有測試皆通過的輸出:

    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)
    

成功! 您已執行測試工具、找出錯誤,並加以修正。

  1. 遵循在 macOS 上安裝 PowerShell 中的指示。

  2. 在終端中執行 pwsh,以驗證安裝:

    pwsh
    

    您的輸出看起來會像這樣:

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

下載測試工具組

測試工具組位於 GitHub 存放庫。 選擇下列其中一個動作:

檢查測試工具組

您剛剛已將測試工具組下載到您所選擇的目錄。 讓我們來看一下您的目錄結構 (如果您選擇下載 .zip 檔案,而不是執行 git clone 命令,請確保您已將檔案解壓縮。) 若您移至 ARM 測試工具組的目錄,應該會看到看起來如下的目錄結構:

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

測試工具組位於 /arm-ttk 子目錄。

建立範本檔案

選擇一個目錄,並建立名為 azuredeploy.json 的檔案。

警告

確定選取的目錄是空的,而且不包含子目錄。

輸入下列內容:

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

記下範本檔案的位置。 您可以在終端中執行 pwd 命令,以輸出路徑。 您稍後將會在執行測試工具組時,使用此路徑作為參數。

透過執行測試工具組來偵測及修正範本的問題

建議您啟動 Visual Studio Code 與整合式終端。

您將會在包含部署範本的路徑上執行測試工具組,並透過變更範本來修正其偵測到的任何錯誤。

警告

在本練習中,您要掃描一個範本檔案。 測試工具組會掃描您指定之目錄底下的所有檔案。 其原因在於部署可包含許多檔案。 請確認 azuredeploy.json 所在目錄底下,沒有任何 JSON 檔案。

  1. 在終端中,移至您的 azuredeploy.json 檔案所在的路徑。 執行下列命令以啟動 Visual Studio Code:

    code .
    

    注意

    手動開啟 Visual Studio Code,若 Visual Studio Code 不在路徑上,請開啟範本目錄。

  2. 從 Visual Studio Code,選取頂端功能表中的 [終端]>[新增終端],以開啟整合式終端。 在終端機中執行下列命令,以啟動 PowerShell 殼層:

    pwsh
    

    您會看到如下所示的輸出:

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

分析範本

  1. 執行 Import-Module,以便能從任何位置執行測試。

    注意

    在匯入模組之前,請將 path/to/arm-ttk/arm-ttk.psd1 取代為所下載測試工具組的路徑。

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

    提示

    如果已將工具下載或複製到 [下載] 目錄,則路徑看起來會像下面這樣:/Users/<使用者>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1

    現在您已準備就緒,可以開始使用工具。 只要在相同的 PowerShell 工作階段中,就無須再次執行匯入命令。

  2. 使用指向範本檔案路徑位置 (不包括檔案名稱) 的 -TemplatePath 參數,執行 Test-AzTemplate

    Test-AzTemplate -TemplatePath .
    

    您應該會在終端內看到如下的輸出:

    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)
    

    上述輸出會顯示兩個測試失敗的情況:資源應具有位置,以及必須參考參數。 前置詞 [-] 表示失敗的測試。

    若要了解發生什麼情況,請開啟 azuredeploy.json 檔案。 其看起來應該如下:

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

    測試失敗的原因有兩個:

    • 未使用 location 參數。 例如,此錯誤訊息可能表示我們先前曾使用過該參數,但忘記進行清理。 或者可能已使用該參數,但我們忘記更新程式碼。
    • The location property is set to the hardcoded string westus (location 屬性已設為硬式編碼字串 westus)。 使用此選項並非良好作法,因為您會想要在部署時,使用輸入參數控制資源位置。

將修正套用至範本

如何修正失敗的測試?

如測試所示,我們可嘗試將 wesus 取代成文字 global。 但是,那樣只會修正其中一個問題。 我們很可能會想要使用 location 參數,並將資源位置設定為該值。

原因有兩個。 location 參數不只可針對部署設定為參數,還會在執行部署期間省略設定 location 時,具備設定 resourceGroup().location 作為 defaultValue 的合理後援。

  1. 找出 resources 陣列中的第一個資源項目,然後將下列內容:

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

    取代為此內容:

    "resources": [{
      "location": "[parameters('location')]"
    }]
    
  2. 在整合式終端中再次執行測試工具,以驗證修正:

    Test-AzTemplate -TemplatePath .
    

    您現在會取得所有測試皆通過的輸出:

    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)
    

成功! 您已執行測試工具、找出錯誤,並加以修正。

  1. 遵循在 Windows 上安裝 PowerShell 中的指示。
  2. 從 Visual Studio Code 安裝 PowerShell 延伸模組 \(英文\)。

下載測試工具組

測試工具組位於 GitHub 存放庫。 選擇下列其中一個動作:

檢查測試工具組

您剛剛已將測試工具組下載到您所選擇的目錄。 讓我們來看一下您的目錄結構 (如果您選擇下載 .zip 檔案,而不是執行 git clone 命令,請確保您已將檔案解壓縮。) 若您移至 ARM 測試工具組的目錄,應該會看到看起來如下的目錄結構:

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

測試工具組位於 \arm-ttk 子目錄。

建立範本檔案

在您選擇的目錄 (例如 C:\Temp) 中建立名為 azuredeploy.json 的檔案。

警告

確定選取的目錄是空的,而且不包含子目錄。

輸入下列內容:

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

記下範本檔案的位置。 在執行測試工具組時,您將使用此目錄路徑 (例如 C:\Temp) 作為參數。

透過執行測試工具組來偵測及修正範本的問題

建議您啟動 Visual Studio Code 與整合式終端。

您將會在包含部署範本的路徑上執行測試工具組,並透過變更範本來修正其偵測到的任何錯誤。

警告

在本練習中,您要掃描一個範本檔案。 測試工具組會掃描您指定之目錄底下的所有檔案。 其原因在於部署可包含許多檔案。 請確認 azuredeploy.json 所在目錄底下,沒有任何 JSON 檔案。

  1. 在終端中,移至您的 azuredeploy.json 檔案所在的路徑。 執行下列命令以啟動 Visual Studio Code:

    code .
    

    注意

    手動開啟 Visual Studio Code,若 Visual Studio Code 不在路徑上,請開啟範本目錄。

  2. 從 Visual Studio Code,開啟命令選擇區,並選取 [PowerShell: 顯示整合式主控台] 命令。

分析範本

  1. 在 PowerShell 終端機中執行 Import-Module

    注意

    在匯入模組之前,請將 path\to\arm-ttk\arm-ttk.psd1 取代為所下載測試工具組的路徑。

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

    上述命令將會指出測試工具組模組的位置。

    提示

    如果已將工具下載或複製到 [下載] 目錄,則路徑看起來會像下面這樣:C:\Users\<使用者>\Downloads\arm-ttk\arm-ttk\arm-ttk.psd1

    現在您已準備就緒,可以開始使用工具。 只要在相同的 PowerShell 工作階段中,就無須再次執行匯入命令。

    注意

    如果您啟動新的 PowerShell 工作階段,則必須再次執行 Import-Module 命令。

  2. 在 PowerShell 終端機中執行 Test-AzTemplate,以啟動測試回合:

    Test-AzTemplate -TemplatePath .
    

    您應該會在終端內看到如下的輸出:

    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
    

    前述輸出顯示三個測試為何失敗:位置不應硬式編碼必須參考參數,以及資源應具有位置。 前置詞 [-] 表示失敗的測試。

    若要了解發生什麼情況,請開啟 azuredeploy.json 檔案。 其看起來應該如下:

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

    測試失敗的原因有兩個:

    • 未使用 location 參數。 例如,此錯誤訊息可能表示我們先前曾使用過該參數,但忘記進行清理。 或者可能已使用該參數,但我們忘記更新程式碼。
    • The location property is set to the hardcoded string westus (location 屬性已設為硬式編碼字串 westus)。 使用此選項並非良好作法,因為您會想要在部署時,使用輸入參數控制資源位置。

將修正套用至範本

如何修正失敗的測試?

如測試所示,我們可嘗試將 wesus 取代成文字 global。 但是,那樣只會修正其中一個問題。 我們很可能會想要使用 location 參數,並將資源位置設定為該值。

原因有兩個。 location 參數不只可針對部署設定為參數,還會在執行部署期間省略設定 location 時,具備設定 resourceGroup().location 作為 defaultValue 的合理後援。

  1. 找出 resources 陣列中的第一個資源項目,然後將下列內容:

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

    取代為此內容:

    "resources": [{
       "location": "[parameters('location')]"
    }]
    
  2. 執行 Test-AzTemplate 以再次執行測試工具:

    Test-AzTemplate -TemplatePath .
    

    您現在會取得所有測試皆通過的輸出:

    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   
    

成功! 您已執行測試工具、找出錯誤,並加以修正。

現在您已準備好在範本上執行測試。