解决资源名称和类型不匹配的错误

本文介绍当资源名称的格式与资源类型的格式不匹配时如何解决此错误。

症状

在部署模板时收到错误代码为 InvalidTemplate 的错误。 该消息表明资源类型和名称不匹配。 它建议修复名称中的段数。

原因

资源类型包含资源提供程序命名空间和类型的一个或多个段。 每个段都表示资源层次结构中的一个级别,并用斜杠分隔。

{resource-provider-namespace}/{type-segment-1}/{type-segment-2}

资源名称包含一个或多个用斜杠分隔的段。 段数必须与资源类型中的数字匹配。

{name-segment-1}/{name-segment-2}

如果资源类型和名称包含不同数量的段,则会出现此错误。

解决方案

请确保了解资源类型的级别。 例如,密钥保管库资源具有完全限定的资源类型 Microsoft.KeyVault/vaults。 你可以忽略资源提供程序命名空间 (Microsoft.KeyVault) 并专注于类型 (vaults) 。 它有一个段。

密钥保管库机密是保管库的子资源。 它具有完全限定的资源类型 Microsoft.KeyVault/vaults/secrets。 此资源类型具有两个段 (vaults/secrets)。

若要指定密钥保管库的名称,只需提供一个段,如 examplevault123。 若要指定机密的名称,请提供两个段,如 examplevault123/examplesecret。 第一个段表示存储此机密的密钥保管库。

下面的示例显示了资源名称的有效格式。

resource kv 'Microsoft.KeyVault/vaults@2022-07-01' = {
  name: 'examplevault123'
  ...
}

如果提供具有多个段的名称,将会出现错误。

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 属性并提供父资源的符号名称。 使用 parent 属性时,将为你构造全名,因此你可以将子资源名称作为单个段提供。

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 模板中设置子资源的名称和类型