Partager via


Résoudre les erreurs de nom de ressource et d’incompatibilité de type

Cet article explique comment résoudre l’erreur lorsque le format du nom de la ressource ne correspond pas au format du type de ressource.

Symptôme

Lors du déploiement d’un modèle, vous recevez une erreur avec le code InvalidTemplated’erreur . Le message indique que le type de ressource et le nom ne correspondent pas. Il suggère de corriger le nombre de segments dans le nom.

La cause

Un type de ressource contient l’espace de noms du fournisseur de ressources et un ou plusieurs segments pour les types. Chaque segment représente un niveau dans la hiérarchie de ressources et est séparé par une barre oblique.

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

Le nom de la ressource contient un ou plusieurs segments séparés par des barres obliques. Le nombre de segments doit correspondre au nombre dans le type de ressource.

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

Si le type de ressource et le nom contiennent un nombre différent de segments, vous obtenez cette erreur.

Solution

Veillez à comprendre le niveau du type de ressource. Par exemple, une ressource de coffre de clés a un type de ressource complet Microsoft.KeyVault/vaults. Vous pouvez ignorer l’espace de noms du fournisseur de ressources (Microsoft.KeyVault) et vous concentrer sur le type (vaults). Elle possède un segment.

Un secret de coffre de clés est une ressource enfant du coffre. Son type de ressource complet est Microsoft.KeyVault/vaults/secrets. Ce type de ressource comporte deux segments (vaults/secrets).

Pour spécifier un nom pour le coffre de clés, fournissez un seul segment, par exemple examplevault123. Pour spécifier un nom pour le secret, fournissez deux segments, comme examplevault123/examplesecret. Le premier segment indique le coffre de clés où ce secret est stocké.

L’exemple suivant montre un format valide pour le nom de la ressource.

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

Une erreur s’affiche si vous avez fourni un nom avec plusieurs segments.

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

Lorsque vous imbriquez une ressource enfant dans la ressource parente, fournissez simplement le segment supplémentaire. Le type de ressource complet et le nom contiennent toujours les valeurs de la ressource parente, mais ils sont construits pour vous. Dans l’exemple suivant, le type est secrets et le nom est examplesecret.

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

Lorsque vous définissez la ressource enfant en dehors du parent, fournissez le type de ressource complet. Pour JSON, indiquez le nom complet de la ressource.

Pour Bicep, utilisez la parent propriété et fournissez le nom symbolique de la ressource parente. Lorsque vous utilisez la propriété parent, le nom complet est construit pour vous, vous devez donc fournir le nom de la ressource enfant sous la forme d’un segment unique.

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

Pour plus d’informations, consultez Définir le nom et le type des ressources enfants dans Bicep ou Définir le nom et le type des ressources enfants dans les modèles ARM.