この記事では、Bicep ファイルと Azure Resource Manager テンプレート (ARM テンプレート) の無効なテンプレート エラーを解決する方法について説明します。 このエラーは、構文エラー、無効なパラメーター値、循環依存関係など、いくつかの理由で発生します。
症状
テンプレートがデプロイされると、次を示すエラーが表示されます。
Code=InvalidTemplate
Message=<varies>
エラー メッセージは、エラーの種類によって異なります。
原因
このエラーは、さまざまな種類のエラーが原因で発生する可能性があります。 通常、テンプレートには構文または構造エラーが含まれます。
解決策 1: 構文エラー
テンプレートの検証に失敗したことを示すエラー メッセージが表示された場合は、テンプレートに構文の問題が発生している可能性があります。
Code=InvalidTemplate
Message=Deployment template validation failed
テンプレート式には多くの要素があるため、構文エラーが発生する可能性があります。 たとえば、ストレージ アカウントの名前の割り当てには、単一または二重引用符、中かっこ、角かっこ、かっこのペアが含まれます。 式には、ドル記号、コンマ、ドットなどの関数と文字も含まれます。
この種類のエラーが発生したら、式の構文を確認します。 テンプレート エラーを特定するには、最新の Bicep 拡張機能または Azure Resource Manager Tools 拡張機能で Visual Studio Code を使用できます。
解決策 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
パラメーターの許容値のテンプレートを確認し、デプロイ時に許容値を使用します。 詳細については、 Bicep または ARM テンプレートで使用できる値を参照してください。
解決策 4: ターゲット リソース グループが多すぎます
このエラーは、1 つのデプロイで 5 つのターゲット リソース グループに制限されていたため、以前のデプロイで発生する可能性があります。 2020 年 5 月には、この制限が 800 個のリソース グループに引き上げられました。 詳細については、 Bicep または ARM テンプレートの複数のリソース グループにデプロイする方法を参照してください。
解決策 5: 循環依存関係が検出されました
このエラーは、デプロイの開始を妨げる方法でリソースが相互に依存している場合に発生します。 相互依存関係を組み合わせることで、2 つ以上のリソースが、待機している他のリソースを待機します。 たとえば、 resource1
は resource3
に依存し、 resource2
は resource1
に依存し、 resource3
は resource2
に依存します。 通常、不要な依存関係を削除することで、この問題を解決できます。
Bicep では、あるリソースが別のリソースのシンボリック名を使用すると、暗黙的な依存関係が作成されます。 通常、 dependsOn
を使用する明示的な依存関係は必要ありません。 詳細については、「Bicep の依存関係」を参照してください。
循環依存関係を解決するには:
- テンプレートで、循環依存関係で識別されるリソースを見つけます。
- そのリソースについて、
dependsOn
プロパティと、reference
関数またはresourceId
関数の使用方法を調べて、依存しているリソースを確認します。 - これらのリソースを調べて、依存しているリソースを確認します。 元のリソースに依存するリソースが見つかるまで、依存関係に従います。
- 循環依存関係に関連するリソースについては、
dependsOn
プロパティのすべての使用方法を慎重に調べて、不要な依存関係を特定します。 デプロイのトラブルシューティングを行うには、循環依存関係を削除します。 コードを削除するのではなく、コメントを使用して、次のデプロイ時にコードが実行されないようにすることができます。//
または/* ... */
ファイルでは、単一行コメント () または複数行コメント () を使用できます。 - テンプレートを再デプロイします。
dependsOn
プロパティから値を削除すると、テンプレートをデプロイするときにエラーが発生する可能性があります。 エラーが発生した場合は、テンプレートに依存関係を追加し直します。 テンプレート内のコードをバイパスするためにコメントを使用した場合は、コメントを削除してコードを復元できます。
この方法で循環依存関係が解決しない場合は、デプロイ ロジックの一部を子リソース (拡張機能や構成設定など) に移動することを検討してください。 循環依存関係に関係するリソースの後にデプロイするように、これらの子リソースを構成します。 たとえば、2 つの仮想マシンをデプロイする場合を考えてみます。それぞれ互いに参照するプロパティを設定する必要があるとします。 この仮想マシンは、次の順序でデプロイできます。
- VM1の
- VM2の
- vm1 の拡張機能は vm1 と vm2 に依存します。 拡張機能は vm2 から取得した値を vm1 に設定します。
- vm2 の拡張機能は vm1 と vm2 に依存します。 拡張機能は vm1 から取得した値を vm2 に設定します。
App Service アプリでも同じ方法が機能します。 構成値をアプリ リソースの子リソースに移動することを検討してください。 次の順序で 2 つの Web アプリをデプロイできます。
- ウェブアプリケーション1
- ウェブアプリケーション2
- webapp1 の構成は、webapp1 と webapp2 によって異なります。 これには、webapp2 の値を含むアプリ設定が含まれています。
- webapp2 の構成は、webapp1 と webapp2 によって異なります。 これには、webapp1 の値を含むアプリ設定が含まれています。
解決策 6: エクスポートされたテンプレートの構文を検証する
Azure にリソースをデプロイした後、ARM テンプレート JSON をエクスポートし、他のデプロイ用に変更できます。 エクスポートしたテンプレートを使用してリソースをデプロイする 前に 、正しい構文を検証する必要があります。
テンプレートは、 ポータル、 Azure CLI、または Azure PowerShell からエクスポートできます。 テンプレートをリソースまたはリソース グループからエクスポートしたか、デプロイ履歴からエクスポートしたかに関わらず、推奨事項があります。
ARM テンプレートをエクスポートした後、JSON テンプレートを Bicep に逆コンパイルできます。 次に、ベスト プラクティスとリンターを使用してコードを検証します。
詳細については、次の記事を参照してください。