Доступ к учетной записи хранения Azure через Synapse через управляемую идентификацию

Я пытаюсь подключиться к хранилищу BLOB-объектов Azure через синапс Azure через управляемую идентификацию на основе следующего набора шагов:

  1. Присвоение идентификатора серверу

  2. Предоставил доступ к серверу в хранилище BLOB-объектов в качестве участника

  3. Выполнил следующие запросы

    Создать мастер-ключ

    СОЗДАТЬ УЧЕТНЫЙ MSI с ОБЪЕМОМ БАЗЫ ДАННЫХ С ИДЕНТИФИКАЦИЕЙ = 'Идентификатор управляемой службы';

     CREATE EXTERNAL DATA SOURCE [BlobStorage] WITH
    

    (
    TYPE = hadoop,

    LOCATION = 'abfss: // ‹› @ ‹› .dfs.core.windows.net', CREDENTIAL = MSI)

  4. Созданный внешний формат файла

Когда я пытаюсь создать внешнюю таблицу, я получаю следующую ошибку:

External file access failed due to internal error: 'Error occurred while accessing HDFS: Java exception raised on call to HdfsBridge_IsDirExist. Java exception message: HdfsBridge::isDirExist - Unexpected error encountered checking whether directory exists or not: AbfsRestOperationException: Operation failed: "This endpoint does not support BlobStorageEvents or SoftDelete. Please disable these account features if you would like to use this endpoint.", 409, HEAD, https://<<>>.dfs.core.windows.net/<<>>//?upn=false&action=getAccessControl&timeout=90'

Так что я упускаю?


person Nandan    schedule 31.12.2020    source источник


Ответы (1)


Доброе утро

Вот пример сценария, который я использую для демонстрации подключения к хранилищу BLOB-объектов с использованием сквозной передачи идентификатора (управляемой или пользовательской). Этот пример будет работать с пулами без SQL Server, с управляемыми пулами вам нужно будет добавить дополнительные параметры для указания hadoop. Если возникнут проблемы, дайте мне знать. Это также дополнительный скрипт Powershell, который вам может понадобиться в конце.

--Create a master key, once per database
--CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'RandomPassword!!££1132'; 
/* 
DROP EXTERNAL TABLE dbo.Test_useridentity 
DROP EXTERNAL DATA SOURCE blobstorage_via_useridentity

DROP EXTERNAL TABLE dbo.Test_managedidentity 
DROP EXTERNAL DATA SOURCE blobstorage_via_managedidentity 
DROP DATABASE SCOPED CREDENTIAL cred_via_managedidentity

DROP EXTERNAL FILE FORMAT textfile_csv_withheader
*/

--Create external file format for CSV 
CREATE EXTERNAL FILE FORMAT textfile_csv_withheader WITH (  
        FORMAT_TYPE = DELIMITEDTEXT,
        FORMAT_OPTIONS ( 
        FIELD_TERMINATOR = ',',
        STRING_DELIMITER = '\"',
        FIRST_ROW  = 2
        )
    );
    
--Create Credentials for accessing external data source using various methods
--This has been done at storage account level for this example 
CREATE DATABASE SCOPED CREDENTIAL cred_via_managedidentity WITH IDENTITY =
'Managed Identity' GO

CREATE EXTERNAL DATA SOURCE blobstorage_via_managedidentity WITH (
    CREDENTIAL = cred_via_managedidentity,
    LOCATION = 'abfss://[email protected]' )

--Dont specify the credential for user identity passthrough 
CREATE EXTERNAL DATA SOURCE blobstorage_via_useridentity WITH (
    LOCATION = 'abfss://[email protected]' )

CREATE EXTERNAL TABLE dbo.Test_ManagedIdentity ( [col1] varchar(100),
[col2] varchar(100), [col3] varchar(100) ) WITH ( LOCATION =
'/test.csv',
    DATA_SOURCE = blobstorage_via_managedidentity,
    FILE_FORMAT = [textfile_csv_withheader] );

CREATE EXTERNAL TABLE dbo.Test_UserIdentity ( [col1] varchar(100),
[col2] varchar(100), [col3] varchar(100) ) WITH ( LOCATION =
'/test.csv',
    DATA_SOURCE = blobstorage_via_useridentity,
    FILE_FORMAT = [textfile_csv_withheader] );

--Added use 'synapseaccountname' to allow access via the managed identity as Storage Blob Data Reader 
select * from Test_ManagedIdentity  --This will work for Private Links, others will not
--Added my user to the storage '[email protected]' account as Storage Blob Data Reader, can take 5-10 mins to replicate 
select * from Test_UserIdentity

Сценарий PowerShell, который вам может понадобиться в зависимости от настроек безопасности, чтобы разрешить подключение через брандмауэр:

$resourceGroupName = "xxxx-rg-name"
$accountName = "xxxxSynapseAccountNamexxxx"
$tenantId = "Guid for your Azure Tenant"
$resourceId1 = "/subscriptions/xxxxx-aaaa-sssss-guid/resourcegroups/xxxx-rg-name/providers/Microsoft.Synapse/workspaces/xxxxSynapseAccountNamexxxx"

Add-AzStorageAccountNetworkRule -ResourceGroupName $resourceGroupName -Name $accountName -TenantId $tenantId -ResourceId $resourceId1

$rule = Get-AzStorageAccountNetworkRuleSet -ResourceGroupName $resourceGroupName -Name $accountName
$rule.ResourceAccessRules

Надеюсь, это поможет, дайте мне знать, если возникнут проблемы

person user5004137    schedule 02.01.2021