Устранение ошибок при несоответствии имени и типа ресурса

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

Симптом

При развертывании шаблона появляется сообщение об ошибке с кодом 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 и укажите символьное имя родительского ресурса. При использовании родительского свойства полное имя будет создано за вас, поэтому нужно указать имя дочернего ресурса в виде одного сегмента.

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.