Я пытаюсь назначить соединитель доступа к Databricks учетной записи хранилища в качестве участника данных BLOB-объекта хранилища, используя этот скрипт.
function Assign-RBACRoleToAccessConnector {
param (
[string] $rgName,
[string] $acName,
[string] $saName,
[string] $subscriptionId
)
# Get the object ID of the access connector
Write-Host "we are here 1"
$accessConnector = Get-AzDatabricksAccessConnector -ResourceGroupName $rgName -Name $acName
# $accessConnector = Get-AzDataBricksWorkspace -ResourceGroupName $rgName -Name $acName
$accessConnector
Write-Host "we are here 2"
$accessConnectorObjectId = $accessConnector.Identity.PrincipalId
Write-Host "Access Connector Object ID: $accessConnectorObjectId"
# Get the object ID of the storage account
# $storageAccount = Get-AzStorageAccount -ResourceGroupName $rgName -Name $saName
# # $storageAccountObjectId = $storageAccount.Identity.PrincipalId
# Assign RBAC role to the access connector
az role assignment create --assignee $accessConnectorObjectId --role "Storage Blob Data Contributor" --scope "/subscriptions/$subscriptionId/resourceGroups/$rgName/providers/Microsoft.Storage/storageAccounts/$saName"
}
Но это не работает! Я пытался отладить, получая выходные данные один за другим. первый вывод переменной $accessConnector прошел успешно. Я вижу подробные данные, включая IdentityPrincipalId, но затем второй вывод $accessConnectorObjectId этой переменной пуст. Я могу это получить, поэтому это приводит к ошибке
Идентификатор объекта соединителя доступа:
ОШИБКА: аргумент --assignee: ожидаемый аргумент
Как я могу это исправить?
внутри функции или отдельно?
отдельно, потому что ошибка подразумевает, что либо $accessConnectorObjectId имеет значение NULL, либо имеет более 1 значения.
я просто сделал это внутри функции и получил вот это we are here 1 0 we are here 2 Access Connector Object ID: попробую запустить отдельно
оно возвращается 0. Что может быть причиной
ну, поэтому не найден соединитель Databricks с аргументами, которые вы передаете Get-AzDatabricksAccessConnector. Вы уверены, что ваш контекст Az правильный? Вы уверены, что имя RG и имя разъема DA верны?
я это понимаю, но если вы посмотрите на приведенный выше код, я сказал, что могу получить выходные данные переменной $accessConnector, которая представляет собой огромный список свойств; включая IdentityPrincipalId.
ааа, кажется, я знаю, в чем ваша проблема: P вы используете Identity.PrincipalId в своем коде, а фактическое имя свойства должно быть IdentityPrincipalId (без точек, без вложенного свойства), это опечатка;)
пожалуйста, дайте ответ, вы правы хаха


Проблема вызвана опечаткой в $accessConnector.Identity.PrincipalId, просмотрев Выходные данные из документации Get-AzDatabricksAccessConnector , мы видим, что командлет выводит объект, реализующий интерфейс IAccessConnector , и, если мы посмотрим на свойства этого интерфейса мы видим, что имя свойства — .IdentityPrincipalId вместо .Identity.PrincipalId (по сути, вложенный объект со свойством .PrincipalId под .Identity). Итак, вы на самом деле получили null за ссылку на член, которого нет в вашем объекте, и, как следствие, за эту ошибку в az CLI.
Итак, решение проблемы:
$accessConnectorObjectId = $accessConnector.IdentityPrincipalId
Кроме того, я бы рекомендовал вам использовать здесь New-AzRoleAssignment, это дало бы вам гораздо лучшее сообщение об ошибке, которое помогло бы отладить эту проблему намного быстрее:
$newAzRoleAssignmentSplat = @{
ObjectId = $accessConnectorObjectId
RoleDefinitionName = 'Storage Blob Data Contributor'
Scope = "/subscriptions/$subscriptionId/resourceGroups/$rgName/providers/Microsoft.Storage/storageAccounts/$saName"
}
New-AzRoleAssignment @newAzRoleAssignmentSplat
если вы запустите
(Get-AzDatabricksAccessConnector -ResourceGroupName $rgName -Name $acName).Identity.PrincipalId.Count, используя правильные значения для$rgNameи$acName, что вы получите?