Предоставление доступа к Azure Data Lake Gen2 с помощью параметризованного сценария

Мы пытаемся предоставить доступ для чтения и записи ко многим папкам в контейнерах Azure Data Lake Gen 2, и хотя мы можем сделать это через пользовательский интерфейс, это довольно утомительно и должно повторяться для всех сред. Кто-нибудь использовал лучший способ использования Powershell для автоматизации или, по крайней мере, параметризации этого процесса предоставления доступа к контейнерам Azure Data Lake 2-го поколения и избежания предоставления доступа вручную?

К сожалению, я не смог заставить это работать, используя следующую ссылку или другую документацию, поскольку это для поколения 1, но это очень похоже на то, что мне нужно сделать для поколения 2.https://www.sqlchick.com/entries/2018/3 / 17 / назначение-данных-разрешений-для-лазурных-данных-озера-хранилища-часть-3

2 ответа

Решение

Согласно моему тесту, мы можем использовать PowerShell для управления разрешениями Azure Data Lake Gen2. Для более подробной информации, пожалуйста, обратитесь к документу

  1. Установите необходимый модуль
install-Module PowerShellGet –Repository PSGallery –Force
install-Module Az.Storage -Repository PSGallery -RequiredVersion 1.9.1-preview –AllowPrerelease –AllowClobber –Force

Кроме того, обратите внимание, что если вы хотите установить модуль, вам необходимо выполнить некоторые условия

  • .NET Framework - это 4.7.2 или выше установлен
  • PowerShell - это 5.1 или выше
  1. Сценарий
Connect-AzAccount

$groupName=""
$accountName=""
$account= Get-AzStorageAccount -ResourceGroupName $groupName -Name $accountName
$ctx = $account.Context

$filesystemName = "test"
$dirname="template/"
$Id = "<the Object ID of user, group or service principal>"
$dir=Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname
$acl = New-AzDataLakeGen2ItemAclObject -AccessControlType user -EntityId $id -Permission "rw-" -InputObject $dir.ACL
Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -Acl $acl
$dir=Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname
$dir.ACL

Спасибо Джиму Сюй за предоставленный выше сценарий. Я просто дополняю код следующими элементами:

  • Получить все папки из контейнера
  • Назначьте ACL для всех папок
  • Распространить ACL во все подпапки
      $groupName="resource group name"
$accountName="storage account name"
$account= Get-AzStorageAccount -ResourceGroupName $groupName -Name $accountName
$ctx = $account.Context

$filesystemName = "container name"
$Id = (Get-AzADGroup -DisplayName '<type user / group name here>').Id
$items = Get-AzDataLakeGen2ChildItem -Context $ctx -FileSystem $filesystemName

foreach ( $item in $items) {
    
    $dir = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path "$($item.Path)/"
    $acl = New-AzDataLakeGen2ItemAclObject -AccessControlType group -EntityId $id -Permission "rwx" -InputObject $dir.ACL -DefaultScope
     
    # Update ACL on blob item
    Update-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path "$($item.Path)/" -Acl $acl
    
    # Propagate ACL to child blob items
    Set-AzDataLakeGen2AclRecursive -Context $ctx -FileSystem $filesystemName -Path "$($item.Path)/" -Acl $acl
}

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