Назначение роли Azure cli -az

Я пытаюсь назначить соединитель доступа к 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: ожидаемый аргумент

Как я могу это исправить?

если вы запустите (Get-AzDatabricksAccessConnector -ResourceGroupName $rgName -Name $acName).Identity.PrincipalId.Count, используя правильные значения для $rgName и $acName, что вы получите?

Santiago Squarzon 07.05.2024 20:56

внутри функции или отдельно?

Greencolor 07.05.2024 21:03

отдельно, потому что ошибка подразумевает, что либо $accessConnectorObjectId имеет значение NULL, либо имеет более 1 значения.

Santiago Squarzon 07.05.2024 21:04

я просто сделал это внутри функции и получил вот это we are here 1 0 we are here 2 Access Connector Object ID: попробую запустить отдельно

Greencolor 07.05.2024 21:11

оно возвращается 0. Что может быть причиной

Greencolor 07.05.2024 21:26

ну, поэтому не найден соединитель Databricks с аргументами, которые вы передаете Get-AzDatabricksAccessConnector. Вы уверены, что ваш контекст Az правильный? Вы уверены, что имя RG и имя разъема DA верны?

Santiago Squarzon 07.05.2024 21:27

я это понимаю, но если вы посмотрите на приведенный выше код, я сказал, что могу получить выходные данные переменной $accessConnector, которая представляет собой огромный список свойств; включая IdentityPrincipalId.

Greencolor 07.05.2024 21:32

ааа, кажется, я знаю, в чем ваша проблема: P вы используете Identity.PrincipalId в своем коде, а фактическое имя свойства должно быть IdentityPrincipalId (без точек, без вложенного свойства), это опечатка;)

Santiago Squarzon 07.05.2024 21:36

пожалуйста, дайте ответ, вы правы хаха

Greencolor 07.05.2024 21:50
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
9
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема вызвана опечаткой в ​​$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

Другие вопросы по теме