Устранить несоответствие имени и типа ресурса.

В этой статье описывается, как устранить ошибку, если формат имени ресурса не соответствует формату типа ресурса.

Симптом

При развертывании шаблона возникает ошибка с кодом InvalidTemplate. Сообщение указывает, что тип ресурса и имя не совпадают. Он предлагает исправить количество сегментов в имени.

Причина

Тип ресурса содержит пространство имен поставщика ресурсов и один или несколько сегментов для типов. Каждый сегмент представляет уровень в иерархии ресурсов и разделяется косой чертой.

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

Имя ресурса содержит один или несколько сегментов, разделенных косой чертой. Число сегментов должно соответствовать числу в типе ресурса.

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

Если тип ресурса и имя содержат другое количество сегментов, вы получите эту ошибку.

Решение

Убедитесь, что вы понимаете уровень типа ресурса. Например, ресурс хранилища ключей имеет полный тип Microsoft.KeyVault/vaults ресурса. Пространство имен поставщика ресурсов (Microsoft.KeyVault) можно игнорировать и сосредоточиться на типе (хранилищах). Он имеет один сегмент.

Секрет хранилища ключей — это дочерний ресурс хранилища. Он имеет полностью квалифицированный тип ресурса Microsoft.KeyVault/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 свойство и укажите символическое имя родительского ресурса. При использовании родительского свойства полное имя создается для вас, поэтому вы предоставляете имя дочернего ресурса в виде одного сегмента.

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 или Set name and type for child resources in ARM templates.