Compartilhar via


Resolver erros de incompatibilidade de nome e tipo de recurso

Este artigo descreve como resolver o erro quando o formato do nome do recurso não corresponde ao formato do tipo de recurso.

Sintoma

Ao implantar um modelo, você recebe um erro com o código de erro InvalidTemplate. A mensagem indica que o tipo de recurso e o nome não correspondem. Ele sugere corrigir o número de segmentos no nome.

Causa

Um tipo de recurso contém o namespace do provedor de recursos e um ou mais segmentos para tipos. Cada segmento representa um nível na hierarquia de recursos e é separado por uma barra.

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

O nome do recurso contém um ou mais segmentos separados por barras. O número de segmentos deve corresponder ao número no tipo de recurso.

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

Se o tipo de recurso e o nome contêm um número diferente de segmentos, você recebe esse erro.

Solução

Certifique-se de entender o nível do tipo de recurso. Por exemplo, um recurso do cofre de chaves tem um tipo de recurso totalmente qualificado de Microsoft.KeyVault/vaults. Você pode ignorar o namespace do provedor de recursos (Microsoft.KeyVault) e se concentrar no tipo (vaults). Ele tem um segmento.

Um segredo do cofre de chaves é um recurso filho do cofre. Ele tem um tipo de recurso totalmente qualificado de Microsoft.KeyVault/vaults/secrets. Esse tipo de recurso tem dois segmentos (vaults/secrets).

Para especificar um nome para o cofre de chaves, forneça apenas um segmento, como examplevault123. Para especificar um nome para o segredo, forneça dois segmentos, como examplevault123/examplesecret. O primeiro segmento indica o cofre de chaves em que esse segredo está armazenado.

O exemplo a seguir mostra um formato válido para o nome do recurso.

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

Você verá um erro se tiver fornecido um nome com mais de um segmento.

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

Ao aninhar um recurso filho dentro do recurso pai, forneça apenas o segmento extra. O tipo de recurso completo e o nome ainda contêm os valores do recurso pai, mas eles são construídos para você. No exemplo a seguir, o tipo é secrets e o nome é examplesecret.

resource kv 'Microsoft.KeyVault/vaults@2022-07-01' = {
  name: 'examplevault123'
  ...
  resource kvsecret 'secrets' = {
    name: 'examplesecret'
    properties: {
     value: secretValue
    }
  }
}

Ao definir o recurso filho fora do pai, forneça o tipo de recurso completo. Para JSON, forneça o nome completo do recurso.

Para Bicep, use a propriedade parent e forneça o nome simbólico do recurso pai. Quando você usa a propriedade pai, o nome completo é construído para você, portanto, você fornece o nome do recurso filho como um único segmento.

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'
  ...
}

Para obter mais informações, consulte Definir nome e tipo para recursos filho no Bicep ou Definir nome e tipo para recursos filho nos modelos do ARM.