Как определить доступ к данным на основе идентификации в шаблоне bicep

#azure #powershell #claims-based-identity #azure-bicep

Вопрос:

У меня есть ниже в качестве шаблона бицепса, я хочу использовать соединение на основе идентификации, как я могу построить шаблон соответствующим образом.

https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference#connecting-to-host-storage-with-an-identity

Я использовал руководство здесь https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/quickstart-create-bicep-use-visual-studio-code?tabs=PowerShell , для развертывания.

 New-AzResourceGroup -Name exampleRG -Location eastus

New-AzResourceGroupDeployment -ResourceGroupName exampleRG -TemplateFile ./main.bicep -storageName "{your-unique-name}" 
 

Но я получаю ошибку при обращении к файлу шаблона — Код=Недопустимое развертывание; Сообщение=Развертывание шаблона «бицепс»
недопустимо в соответствии с процедурой проверки

 var baseName = uniqueString('identityRepro', subscription().id)
var location = 'uksouth'

resource stg 'Microsoft.Storage/storageAccounts@2019-06-01' = {
  name: baseName
  location: location 
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

resource asp 'Microsoft.Web/serverfarms@2019-08-01' = {
  name: baseName
  location: location
  sku: {
    name: 'Y1'
    tier: 'Dynamic'
  }
}

resource ai 'Microsoft.Insights/components@2015-05-01' = {
  name: baseName
  location: location
  kind: 'web'
  properties: {
    Application_Type: 'web'
  }
}

resource fa 'Microsoft.Web/sites@2019-08-01' = {
  name: baseName
  location: location
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    serverFarmId: asp.id
  }
  kind: 'functionapp'

  resource appSettings 'config@2018-11-01' = {
    name: 'appsettings'
    properties: {
      'AzureWebJobsStorage__accountName': stg.name
      'FUNCTIONS_WORKER_RUNTIME': 'powershell'
      'FUNCTIONS_WORKER_RUNTIME_VERSION': '~7'
      'APPINSIGHTS_INSTRUMENTATIONKEY': ai.properties.InstrumentationKey
    }
  }
}

resource blobContrib 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
  name: guid(fa.name, stg.name, 'ba92f.........d-a403-e96b0029c9fe')
  properties: {
    principalId: fa.identity.principalId
    roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'ba92f.......-a403-e96b0029c9fe')
    principalType: 'ServicePrincipal'
  }
  scope: stg
}
 

Комментарии:

1. Вы проверили вкладку Развертывания в группе ресурсов? Обычно в нем есть более подробные ошибки.

2. Ошибки проверки находятся на вкладке Журнал доступа, проверьте там.

3. Я не могу развернуть его из кода visual studio. Ошибка: Код=Недопустимое развертывание; Сообщение=Развертывание шаблона «бицепс» недопустимо в соответствии с процедурой проверки.

4. Не имеет значения, откуда вы развертываетесь. На портале Azure в журнале действий вы увидите свою попытку проверки, и там может быть более подробная ошибка, объясняющая, почему проверка не удалась.

Ответ №1:

Я думаю, что ваша проблема заключается в идентификаторе роли. Роли определяются на уровне подписки, а не в группе ресурсов. В вашем коде вместо функции resourceId используйте subscriptionResourceId.

Обновление: поскольку вы подробнее разъяснили проблему с github, ваша дополнительная проблема заключалась в том, как создается имя. uniqueString функция генерирует псевдослучайную строку (хэш) на основе начального значения — параметров, которые вы предоставляете функции. когда вы даете точно такие же значения — вы получите тот же результат.

Приведенный ниже код работает для меня

 var baseName = uniqueString(resourceGroup().id)
var location = 'uksouth'

resource stg 'Microsoft.Storage/storageAccounts@2019-06-01' = {
  name: baseName
  location: location 
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

resource asp 'Microsoft.Web/serverfarms@2019-08-01' = {
  name: baseName
  location: location
  sku: {
    name: 'Y1'
    tier: 'Dynamic'
  }
}

resource ai 'Microsoft.Insights/components@2015-05-01' = {
  name: baseName
  location: location
  kind: 'web'
  properties: {
    Application_Type: 'web'
  }
}

resource fa 'Microsoft.Web/sites@2019-08-01' = {
  name: baseName
  location: location
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    serverFarmId: asp.id
  }
  kind: 'functionapp'

  resource appSettings 'config@2018-11-01' = {
    name: 'appsettings'
    properties: {
      'AzureWebJobsStorage__accountName': stg.name
      'FUNCTIONS_WORKER_RUNTIME': 'powershell'
      'FUNCTIONS_WORKER_RUNTIME_VERSION': '~7'
      'APPINSIGHTS_INSTRUMENTATIONKEY': ai.properties.InstrumentationKey
    }
  }
}

resource blobContrib 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
  name: guid(fa.name, stg.name, 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')
  properties: {
    principalId: fa.identity.principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')
    principalType: 'ServicePrincipal'
  }
  scope: stg
}
 

В вашем коде используйте resourceGroup().id в качестве uniqueString параметра — поскольку он содержит уникальный идентификатор guid вашей подписки и имя группы ресурсов, которое должно быть уникальным в подписке — ваш хэш также должен быть уникальным. предоставление только subscription().id создаст одну и ту же строку для всех развертываний в этой подписке и группе ресурсов в ней.

Комментарии:

1. Спасибо вам за комментарий. Но я все еще получаю те же ошибки.

2. Я взял ваш код и развернул его в RG — и все прошло нормально. Однако — вы развертываетесь в группе чистых ресурсов или у вас есть какие-то ресурсы в ней?

3. Я перехожу на новый RG

4. смотрите мой обновленный ответ, основанный на вводе, который вы предоставили на github.

5. Я не уверен в шаблонах, я обратился к пользователям по поводу предупреждения, мне нужно будет найти способ понять, что такое пользовательская роль. здесь идентификатор, который я использую, — это идентификатор подписки