Я пытаюсь перечислить большие двоичные объекты в контейнере в службе хранилища Azure в сценарии Python с помощью Azure SDK.
Однако я получаю сообщение об ошибке «AuthorizationPermissionMismatch».
Это меня удивляет, потому что через графический интерфейс я могу просто так перечислить содержимое. Я владелец контейнера:
и я думаю, что я правильно понял весь код:
from azure.identity import DefaultAzureCredential
from azure.storage.blob import ContainerClient
if __name__ == "__main__":
client = ContainerClient(
credential=DefaultAzureCredential(),
account_url = "https://satestblobaccess.blob.core.windows.net",
container_name = "stcnt-test-blob-access"
)
blob_names = client.list_blob_names()
print([b for b in blob_names])
Я запускаю это в PowerShell, пока я вошел в систему как я, и SDK, кажется, прекрасно распознает мою личность.
Поэтому я ожидаю получить список имен больших двоичных объектов.
Вместо этого я получаю ошибку AuthorizationPermissionMismatch.
Было бы здорово, если бы кто-нибудь подсказал мне, как это исправить...
Вывод такой (извините за искажение, я не могу заставить его отображать разрывы строк, которые я вижу в окне вывода PowerShell):
[INFO azure.identity._credentials.environment] Конфигурация среды не найдена. ИНФОРМАЦИЯ:azure.identity._credentials.environment:Конфигурация среды не найдена. [INFO azure.identity._credentials.managed_identity] ManagedIdentityCredential будет использовать IMDS INFO:azure.identity._credentials.managed_identity:ManagedIdentityCredential будет использовать IMDS INFO:azure.core.pipeline.policies.http_logging_policy:URL-адрес запроса: 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=REDACTED&resource=REDACTED' Метод запроса: «GET» Заголовки запросов: «Агент пользователя»: «azsdk-python-identity/1.15.0 Python/3.10.13 (Windows-10-10.0.19045-SP0)» К запросу не было прикреплено тело DEBUG:urllib3.connectionpool:Запуск нового HTTP-соединения (1): 169.254.169.254:80 [INFO azure.identity._credentials.chained] DefaultAzureCredential получила токен от AzureCliCredential INFO:azure.identity._credentials.chained:DefaultAzureCredential получил токен от AzureCliCredential ИНФОРМАЦИЯ:azure.core.pipeline.policies.http_logging_policy:URL-адрес запроса: 'https://satestblobaccess.blob.core.windows.net/stcnt-test-blob-access?restype=REDACTED&comp=REDACTED' Метод запроса: «GET» Заголовки запросов: 'x-ms-версия': 'УДАЛЕНО' «Принять»: «приложение/xml» «Агент пользователя»: «azsdk-python-storage-blob/12.19.0 Python/3.10.13 (Windows-10-10.0.19045-SP0)» 'x-ms-date': 'УДАЛЕНО' 'x-ms-client-request-id': 'f729fa05-19dd-11ef-ae9a-a434d95f5cd9' «Авторизация»: «УДАЛЕНО» К запросу не было прикреплено тело ОТЛАДКА:urllib3.connectionpool:Запуск нового HTTPS-соединения (1): satestblobaccess.blob.core.windows.net:443 ОТЛАДКА:urllib3.connectionpool:https://satestblobaccess.blob.core.windows.net:443 "GET /stcnt-test-blob-access?restype=container&comp=list HTTP/1.1" 403 279 ИНФОРМАЦИЯ:azure.core.pipeline.policies.http_logging_policy:Состояние ответа: 403 Заголовки ответов: «Длина контента»: «279» «Тип контента»: «приложение/xml» «Сервер»: «Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0» 'x-ms-request-id': 'fc138e07-a01e-0062-75ea-ad615a000000' 'x-ms-client-request-id': 'f729fa05-19dd-11ef-ae9a-a434d95f5cd9' 'x-ms-версия': 'УДАЛЕНО' 'x-ms-код-ошибки': 'AuthorizationPermissionMismatch' «Дата»: «Пятница, 24 мая 2024 г., 14:57:44 по Гринвичу». Traceback (последний вызов последний): Файл «C:\Users\yrdeb\PycharmProjects\test_blob_access_man_ident\main.py», строка 30, в Файл «C:\Users\yrdeb\PycharmProjects\test_blob_access_man_ident\main.py», строка 30, в print([b вместо b в blob_names]) Файл «C:\Users\yrdeb.conda\envs\env3106\lib\site-packages\azure\core\paging.py», строка 123, в следующей строке. вернуться дальше (self._page_iterator) Файл «C:\Users\yrdeb.conda\envs\env3106\lib\site-packages\azure\core\paging.py», строка 75, в следующей строке. self._response = self._get_next(self.continuation_token) Файл «C:\Users\yrdeb.conda\envs\env3106\lib\site-packages\azure\storage\blob_list_blobs_helper.py», строка 179, в _get_next_cb процесс_хранилище_ошибка (ошибка) Файл «C:\Users\yrdeb.conda\envs\env3106\lib\site-packages\azure\storage\blob_shared\response_handlers.py», строка 184, в Process_storage_error exec("вызвать ошибку из None") # pylint:disable=exec-used # nosec Файл "", строка 1, в azure.core.Exceptions.HttpResponseError: этому запросу не разрешено выполнять эту операцию с использованием этого разрешения. Идентификатор запроса: fc138e07-a01e-0062-75ea-ad615a000000 Время:2024-05-24T14:57:44.6182291Z Содержание:
AuthorizationPermissionMismatchЭтому запросу не разрешено выполнять эту операцию с использованием этого разрешения. Идентификатор запроса: fc138e07-a01e-0062-75ea-ad615a000000 Время:2024-05-24T14:57:44.6182291Z
Обратитесь к этому адресу Learn.microsoft.com/en-us/azure/storage/blobs/… вам нужна Storage Blob Data Contributor роль.

AuthorizationPermissionMismatchЭтот запрос не имеет права выполнять эту операцию с использованием этого разрешения. Идентификатор запроса: fc138e07-a01e-0062-75ea-ad615a000000 Время: 2024-05-24T14:57:44.6182291Z
Вышеупомянутая ошибка возникает, если у вас нет надлежащего разрешения на доступ к хранилищу BLOB-объектов Azure.
Согласно этому MS-Document,
Чтобы получить доступ к BLOB-объекту внутри контейнера, вам необходимо назначить роль себе или пользователю Storage Blob Data Contributor.
В своей среде я назначил Storage Blob Data Contributor конкретному контейнеру на портале.
Портал:

Теперь, после назначения роли, я выполнил тот же код в своей среде. Это сработало успешно.
Код
from azure.identity import DefaultAzureCredential
from azure.storage.blob import ContainerClient
if __name__ == "__main__":
client = ContainerClient(
credential=DefaultAzureCredential(),
account_url = "https://venkat456.blob.core.windows.net",
container_name = "test"
)
blob_names = client.list_blob_names()
print([b for b in blob_names])
Выход:
['Adobe Scan 10-Apr-2024.pdf', 'document.PDF', 'gnupg-2.4.5.tar.bz2.sig', 'industry.csv.gpg', 'sample2.ps1']

Это работает, спасибо! Знаете, хотя меня это немного беспокоит. Видите ли, в графическом интерфейсе я могу получить доступ к списку контейнеров без этой роли. Я ожидал, что смогу иметь тот же доступ при использовании CLI или SDK (вход в систему под тем же именем), поэтому мне никогда не приходило в голову, что мне нужно больше разрешений :) ... в любом случае, теперь все хорошо.
Чтобы получить доступ к данным внутри контейнера, вам необходимо назначить себе роль «Участник данных BLOB-объекта хранилища».