Краткое описание проблемы: чтение Python из хранилища BLOB-объектов с использованием Azure SDK для Python завершается с ошибкой на BlockBlobService.get_blob_to_path, с ошибкой у используемого клиента RBAC нет атрибута, называемого «подписанный сеанс», после проверки подлинности в Azure AD .
Деталь:
У меня есть доступ на чтение (в качестве ТРЕТЬЕЙ СТОРОНЫ) к учетной записи хранилища BLOB-объектов Azure - с помощью RBAC Azure Active Directory (управление доступом на основе ролей). Владельцы магазина Blob предоставили мне роль хранилища данных Blob Data Reader.
Подробные примеры, которые я нахожу в Интернете для подключения из Python для чтения из хранилища BLOB-объектов, используют параметры account_name и account_key - но у меня нет этих учетных данных, поскольку я не являюсь владельцем самого хранилища.
Таким образом, я обнаружил, как использовать RBAC для подключения к Azure - однако сама операция чтения, похоже, завершается с ошибкой - хотя я полагаю, что моя проблема на самом деле в том, чтобы создать BlockBlobService.
Я создал упрощенный сценарий для извлечения образца файлов из магазина на основе файлов, которые, как я знаю, мне нужно загрузить. Кажется, я могу подключиться к Azure Active Directory (отключение подключения к Интернету подтверждает сбой), но после выполнения чтения через некоторое время (~ 30 секунд) возникает ошибка, как показано ниже.
Естественно - отредактированные разделы имеют правильные учетные данные / данные в моем коде:
from azure.storage.blob import BlockBlobService
from azure.storage.blob import ContainerPermissions
from azure.graphrbac import GraphRbacManagementClient
from azure.common.credentials import UserPassCredentials
print('Connecting to Azure Active Directory')
credentials = UserPassCredentials(
'myname@email.com', # Your user
'zzzzz', # Your password
resource="https://graph.windows.net"
)
tenant_id = "zzzz"
graphrbac_client = GraphRbacManagementClient(
credentials,
tenant_id
)
AccountName = "account_name"
imagesContainer = "container_name"
## Connect to the Azure Block Blob service using the GraphRBAC
print('Connecting to Azure Block Blob Service')
block_blob_service = BlockBlobService(account_name=AccountName, token_credential=graphrbac_client)
Все вышеперечисленное, кажется, работает правильно, без каких-либо ошибок или исключений. Однако, как только я запускаю код ниже - тогда я получаю ошибку ниже:
block_blob_service.get_blob_to_path(imagesContainer, AzureFilename, newFileName)
Exception has occurred: azure.common.AzureException
'GraphRbacManagementClient' object has no attribute 'signed_session'
File "C:\zzz\PullUnsortedImagesFromAzure.py", line 138, in <module>
block_blob_service.get_blob_to_path(imagesContainer, AzureFilename, newFileName)
File "C:\Python\Python37\Lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Python\Python37\Lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "C:\Python\Python37\Lib\runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
Что интересно, так это то, что в проводнике Windows я действительно вижу создаваемый файл, но на самом деле его не извлекают из хранилища BLOB-объектов.
Я действительно не эксперт, когда дело доходит до AD - так что я предполагаю, но я думаю, что проблема, вероятно, происходит из:
block_blob_service = BlockBlobService(account_name=AccountName, token_credential=graphrbac_client)
Я был бы чрезвычайно признателен, если бы кто-нибудь мог помочь указать, что я должен делать ...
Спасибо!