この記事では、リソース名の形式がリソースの種類の形式と一致しない場合のエラーを解決する方法について説明します。
症状
テンプレートをデプロイすると、エラーコード ( InvalidTemplate
) のエラーが表示されます。 このメッセージは、リソースの種類と名前が一致しないことを示しています。 これは、名前のセグメント数を固定することを提案しています。
原因
リソースの種類には、リソース プロバイダーの名前空間と、種類の 1 つ以上のセグメントが含まれます。 各セグメントは、リソース階層のレベルを表し、スラッシュで区切られます。
{resource-provider-namespace}/{type-segment-1}/{type-segment-2}
リソース名には、スラッシュで区切られた 1 つ以上のセグメントが含まれています。 セグメントの数は、リソースの種類の数と一致する必要があります。
{name-segment-1}/{name-segment-2}
リソースタイプと名前に含まれるセグメントの数が異なる場合、このエラーが発生します。
解決策
リソースタイプのレベルを理解していることを確認してください。 たとえば、キー コンテナー リソースの完全修飾リソースの種類が Microsoft.KeyVault/vaults
であるとします。 リソース プロバイダーの名前空間 (Microsoft.KeyVault) は無視して、種類 (コンテナー) に注目できます。 セグメントは 1 つあります。
キー コンテナー シークレットは、コンテナーの子リソースです。 完全修飾リソースの種類は Microsoft.KeyVault/vaults/secrets
です。 このリソース・タイプには、2つのセグメント(ボールト/シークレット)があります。
キー コンテナーの名前を指定するには、セグメントを 1 つだけ指定します (例: examplevault123
)。 シークレットの名前を指定するには、 examplevault123/examplesecret
のように 2 つのセグメントを指定します。 最初のセグメントは、このシークレットが格納されているキー コンテナーを示します。
次の例は、リソース名の有効な形式を示しています。
複数のセグメントに名前を指定すると、 エラー が表示されます。
resource kv 'Microsoft.KeyVault/vaults@2022-07-01' = {
name: 'contoso/examplevault123'
...
}
親リソース内に子リソースを入れ子にする場合は、追加のセグメントのみを指定します。 完全なリソースの種類と名前には、親リソースの値が含まれていますが、自動的に構築されます。 次の例では、タイプは secrets
で、名前は examplesecret
です。
resource kv 'Microsoft.KeyVault/vaults@2022-07-01' = {
name: 'examplevault123'
...
resource kvsecret 'secrets' = {
name: 'examplesecret'
properties: {
value: secretValue
}
}
}
親の外部で子リソースを定義する場合は、完全なリソースの種類を指定します。 JSON の場合は、完全なリソース名を指定します。
Bicep の場合は、 parent
プロパティを使用し、親リソースのシンボリック名を指定します。 親プロパティを使用すると、完全な名前が自動的に構築されるため、子リソース名を 1 つのセグメントとして指定します。
resource kvsecret 'Microsoft.KeyVault/vaults/secrets@2022-07-01' = {
name: 'examplesecret'
parent: kv
properties: {
value: secretValue
}
}
resource kv 'Microsoft.KeyVault/vaults@2022-07-01' = {
name: 'examplevault123'
...
}
詳細については、「 Bicep で子リソースの名前と種類を設定する 」または「 ARM テンプレートで子リソースの名前と種類を設定する」を参照してください。