無効なテンプレートのエラーを解決する

この記事では、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 ツールの拡張機能を使用できます。

解決策 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 つ以上のリソースが、同じく待機中であるその他のリソースを待機することになります。 たとえば、resource1resource3 に、resource2resource1 に、resource3resource2 にそれぞれ依存している場合などです。 通常、この問題は不要な依存関係を削除することによって解決できます。

Bicep は、あるリソースが別のリソースのシンボリック名を使用するときに、暗黙的な依存関係を作成します。 通常、dependsOn を使用した明示的な依存関係は必要ありません。 詳しくは、Bicep の依存関係を参照してください。

循環依存関係を解決するには:

  1. テンプレートで、循環依存関係が検出されたリソースを検索します。
  2. そのリソースについて、dependsOn プロパティと reference または resourceId 関数の使用を確認し、どのリソースに依存しているかを調べます。
  3. それらのリソースが依存しているリソースを確認します。 元のリソースに依存するリソースを見つけるまで依存関係を辿ります。
  4. 循環依存関係に関連するリソースについては、dependsOn プロパティのすべての使用を慎重に調べ、不要な依存関係を特定します。 デプロイのトラブルシューティングを行うには、循環依存関係を削除します。 コードを削除するのではなく、コメントを使用して、次のデプロイ中にコードが実行されないようにします。 ARM テンプレートまたは Bicep ファイルでは、単一行コメント (//) または複数行コメント (/* ... */) を使用できます。
  5. テンプレートを再デプロイします。

dependsOn プロパティから値を削除すると、テンプレートをデプロイするときにエラーが発生することがあります。 エラーが発生した場合は、テンプレートの依存関係を元に戻します。 テンプレート内のコードをバイパスするためにコメントを使用した場合は、コメントを削除するとコードを復元できます。

このアプローチで循環依存関係が解決しない場合は、デプロイ ロジックの一部 (拡張機能や構成設定など) を子リソースに移行することを検討してください。 それらの子リソースを、循環依存関係に関連するリソースの後にデプロイするように構成します。 たとえば、2 つの仮想マシンをデプロイする場合を考えてみます。それぞれ互いに参照するプロパティを設定する必要があるとします。 この仮想マシンは、次の順序でデプロイできます。

  1. vm1
  2. vm2
  3. vm1 の拡張機能は vm1 と vm2 に依存します。 拡張機能は vm2 から取得した値を vm1 に設定します。
  4. vm2 の拡張機能は vm1 と vm2 に依存します。 拡張機能は vm1 から取得した値を vm2 に設定します。

このアプローチは App Service アプリでも有効です。 構成値をアプリ リソースの子リソースに移動することを検討してください。 2 つの Web アプリは次の順序でデプロイできます。

  1. webapp1
  2. webapp2
  3. webapp1 の構成は webapp1 と webapp2 に依存します。 アプリの設定には webapp2 からの値が含まれています。
  4. webapp2 の構成は webapp1 と webapp2 に依存します。 アプリの設定には webapp1 からの値が含まれています。

解決策 6: エクスポートされたテンプレートの構文を検証する

Azure にリソースをデプロイした後に、ARM テンプレート JSON をエクスポートし、他のデプロイ用に変更できます。 エクスポートされたテンプレートを使用してリソースをデプロイする "前" に、その構文が正しいか検証する必要があります。

テンプレートは、ポータルAzure CLI、または Azure PowerShell からエクスポートできます。 テンプレートをリソースまたはリソース グループからエクスポートしたか、デプロイ履歴からエクスポートしたかに関わらず、推奨事項があります。

ARM テンプレートをエクスポートした後に、JSON テンプレートを Bicep に逆コンパイルできます。 その後に、ベスト プラクティスとリンターを使用してコードを検証します。

詳細については、次の記事を参照してください。