共用方式為


解決無效範本的錯誤

本文說明如何解決 Bicep 檔案和 Azure Resource Manager 範本 (ARM 範本) 無效的範本錯誤。 此錯誤發生的原因有數個,例如語法錯誤、無效的參數值或迴圈相依性。

癥狀

部署範本時,您會收到錯誤訊息,指出:

Code=InvalidTemplate
Message=<varies>

錯誤訊息取決於錯誤的類型。

原因

此錯誤可能是數種不同類型的錯誤所造成。 它們通常涉及範本中的語法或結構錯誤。

解決方案 1:語法錯誤

如果您收到錯誤訊息,指出範本驗證失敗,您的範本中可能有語法問題。

Code=InvalidTemplate
Message=Deployment template validation failed

語法錯誤可能會發生,因為範本表達式有許多元素。 例如,記憶體帳戶的名稱指派包含單引號或雙引號組、大括弧、方括弧和括號。 表達式也包含貨幣符號、逗號和點等函式和字元。

name: 'storage${uniqueString(resourceGroup().id)}'

當您收到這種類型的錯誤時,請檢閱表達式的語法。 若要識別範本錯誤,您可以使用 Visual Studio Code 搭配最新的 Bicep 擴充功能Azure Resource Manager Tools 擴充功能

解決方案 2:不正確的區段長度

當資源名稱的格式不正確時,就會發生另一個無效的範本錯誤。 若要解決該錯誤,請參閱 解決名稱與類型不符的錯誤

解決方案3:參數無效

您可以在樣本中指定參數允許的值。 在部署期間,如果您提供的值不是允許的值,您會收到類似下列錯誤的訊息:

Code=InvalidTemplate;
Message=Deployment template validation failed: 'The provided value {parameter value}
for the template parameter {parameter name} is not valid. The parameter value is not
part of the allowed values

檢查範本中的參數允許值,並在部署期間使用允許的值。 如需詳細資訊,請參閱 BicepARM 範本允許的值。

解決方案 4:太多目標資源群組

您可能會在先前的部署中看到此錯誤,因為您在單一部署中受限於五個目標資源群組。 2020 年 5 月,該限制已增加到 800 個資源群組。 如需詳細資訊,請參閱如何部署至 BicepARM 範本的多個資源群組。

解決方案5:偵測到迴圈相依性

當資源之間的相互依賴導致部署無法開始時,您會收到此錯誤。 相依性的組合可讓兩個或多個資源等候其他也在等候的資源。 例如, resource1 相依於 resource3resource2 相依於 resource1,而 resource3 相依於 resource2。 您通常可以藉由移除不必要的相依性來解決此問題。

當某個資源使用另一個資源的符號名稱時,Bicep 會建立隱含相依性。 明確相依性通常無需使用dependsOn。 如需詳細資訊,請參閱 Bicep 相依性

若要解決迴圈相依性:

  1. 在您的範本中,尋找迴圈相依性中所識別的資源。
  2. 針對該資源,請檢查 dependsOn 屬性以及 referenceresourceId 函式的任何用法,以查看其相依的資源。
  3. 檢查這些資源,以查看其相依的資源。 請遵循相依性,直到您注意到相依於原始資源的資源為止。
  4. 針對迴圈相依性所涉及的資源,請仔細檢查 屬性的所有用法 dependsOn ,以識別不需要的任何相依性。 若要針對部署進行疑難解答,請移除迴圈相依性。 您可以使用註解,而不是刪除程式碼,這樣程式碼在下一次部署時就不會執行。 您可以在 ///* ... */ 檔案中使用單行批注 () 或多行批注 。
  5. 重新部署範本。

dependsOn 屬性移除值可能會導致部署範本時發生錯誤。 如果您收到錯誤,請將相依性重新加入範本中。 如果您使用批註略過範本中的程式碼,您可以移除批註以還原程式代碼。

如果該方法無法解決迴圈相依性,請考慮將部分部署邏輯移至子資源(例如擴充功能或組態設定)。 將這些子資源設定為在涉及迴圈相依性的資源之後進行部署。 例如,假設您要部署兩部虛擬機器,但是您必須分別在上面設定互相參考的屬性。 您可以採取下列順序部署︰

  1. 虛擬機 1
  2. 虛擬機 2
  3. vm1 的擴充相依於 vm1 和 vm2。 擴充在 vm1 上設定從 vm2 取得的值。
  4. vm2 的擴充相依於 vm1 和 vm2。 擴充在 vm2 上設定從 vm1 取得的值。

相同的方法適用於App Service 應用程式。 請考慮將組態值移至應用程式資源的子資源。 您可以依下列順序部署兩個 Web 應用程式:

  1. web應用程式1
  2. web應用程式2
  3. webapp1 的設定取決於 webapp1 和 webapp2。 其中包含來自 webapp2 的值的應用程式設定。
  4. webapp2 的設定取決於 webapp1 和 webapp2。 應用程式設定包含來自 webapp1 的值。

解決方案 6:驗證匯出範本的語法

在 Azure 中部署資源之後,您可以匯出 ARM 範本 JSON,並針對其他部署加以修改。 您應該先驗證導出的範本是否有正確的語法, 使用它來部署資源。

您可以從 入口網站Azure CLIAzure PowerShell 導出範本。 無論您是從資源或資源群組,還是從部署歷程記錄中匯出範本,都有一些建議。

匯出 ARM 範本之後,您可以將 JSON 範本分解為 Bicep。 然後使用最佳做法和linter來驗證您的程式代碼。

如需詳細資訊,請移至下列文章: