Принципал службы Azure и хранилище.blob с Python

Я пытаюсь пройти проверку подлинности с помощью участника службы через python и затем получить доступ к azure.storage.blob

Используется для этого с:

NAME = '****'
KEY = '****'
block_blob_service = BlockBlobService(account_name=NAME, account_key=KEY, protocol='https')

Но я не могу заставить его работать с принципалом службы:

TENANT_ID = '****'

CLIENT = '****'

KEY_SERVICE = '****'

credentials = ServicePrincipalCredentials(
    client_id = CLIENT,
    secret = KEY_SERVICE,
    tenant = TENANT_ID
    )

Я немного сбит с толку, как я соединяю эти 2, и все, что я пытаюсь сделать, просто дает мне тайм-аут, когда я пытаюсь загрузить большой объект.

2 ответа

Это очень сбивает с толку. После регистрации субъекта-службы (SP) на лазурном портале с созданием нового секрета...

... назначен Contributor роль на уровне группы ресурсов...

... любые учетные записи хранения и контейнеры в них наследуют эту роль.

В своем приложении вы можете создать ServicePrincipalCredentials() и ClientSecretCredential() с зарегистрированного ИП...

service_credential = ServicePrincipalCredentials(
    tenant = '<yourTenantID>',
    client_id = '<yourClientID>',
    secret = '<yourClientSecret>'
)

client_credential = ClientSecretCredential(
    '<yourTenantID>',
    '<yourClientID>',
    '<yourClientSecret>'
)

Отсюда создайте ResourceManagementClient()...

resource_client = ResourceManagementClient(service_credential, subscription_id)

... чтобы перечислить RG, ресурсы и учетные записи хранения.

for item in resource_client.resource_groups.list():
    print(item.name)

for item in resource_client.resources.list():
    print(item.name + " " + item.type)

for item in resource_client.resources.list_by_resource_group('azureStorage'):
    print(item.name)

НО... из моих исследований, вы не можете перечислить контейнеры BLOB-объектов или BLOB-объекты в данном контейнере, используя ResourceManagementClient()!!. Итак, мы переходим кBlobServiceClient()

blob_service_client = BlobServiceClient(account_url = url, credential=client_credential)

Отсюда вы можете перечислить контейнеры BLOB-объектов...

blob_list = blob_service_client.list_containers()
for blob in blob_list:
    print(blob.name + " " + str(blob.last_modified))

НО... Судя по моим исследованиям, вы не можете перечислить капли внутри контейнера!!!

container_client = blob_service_client.get_container_client('testcontainer')

blob_list = container_client.list_blobs()
for blob in blob_list:
    print("\t" + blob.name)

---------------------------------------------------------------------------
StorageErrorException                     Traceback (most recent call last)
~/anaconda3_501/lib/python3.6/site-packages/azure/storage/blob/_models.py in _get_next_cb(self, continuation_token)
    599                 cls=return_context_and_deserialized,
--> 600                 use_location=self.location_mode)
    601         except StorageErrorException as error:

~/anaconda3_501/lib/python3.6/site-packages/azure/storage/blob/_generated/operations/_container_operations.py in list_blob_flat_segment(self, prefix, marker, maxresults, include, timeout, request_id, cls, **kwargs)
   1142             map_error(status_code=response.status_code, response=response, error_map=error_map)
-> 1143             raise models.StorageErrorException(response, self._deserialize)
   1144 

StorageErrorException: Operation returned an invalid status 'This request is not authorized to perform this operation using this permission.'

During handling of the above exception, another exception occurred:

HttpResponseError                         Traceback (most recent call last)
<ipython-input-104-7517e7a6a19f> in <module>
      1 container_client = blob_service_client.get_container_client('testcontainer')
      2 blob_list = container_client.list_blobs()
----> 3 for blob in blob_list:
      4     print("\t" + blob.name)

~/anaconda3_501/lib/python3.6/site-packages/azure/core/paging.py in __next__(self)
    120         if self._page_iterator is None:
    121             self._page_iterator = itertools.chain.from_iterable(self.by_page())
--> 122         return next(self._page_iterator)
    123 
    124     next = __next__  # Python 2 compatibility.

~/anaconda3_501/lib/python3.6/site-packages/azure/core/paging.py in __next__(self)
     72             raise StopIteration("End of paging")
     73 
---> 74         self._response = self._get_next(self.continuation_token)
     75         self._did_a_call_already = True
     76 

~/anaconda3_501/lib/python3.6/site-packages/azure/storage/blob/_models.py in _get_next_cb(self, continuation_token)
    600                 use_location=self.location_mode)
    601         except StorageErrorException as error:
--> 602             process_storage_error(error)
    603 
    604     def _extract_data_cb(self, get_next_return):

~/anaconda3_501/lib/python3.6/site-packages/azure/storage/blob/_shared/response_handlers.py in process_storage_error(storage_error)
    145     error.error_code = error_code
    146     error.additional_info = additional_data
--> 147     raise error
    148 
    149 

HttpResponseError: This request is not authorized to perform this operation using this permission.
RequestId:e056fe39-b01e-0007-425c-20a63f000000
Time:2020-05-02T08:32:02.2204809Z
ErrorCode:AuthorizationPermissionMismatch
Error:None

Единственный способ, который я нашел для перечисления больших двоичных объектов в контейнере (и выполнения других действий, таких как копирование больших двоичных объектов и т. Д.), - это создать BlobServiceClient используя строку подключения, а не TenantID, ClientID, ClientSecret.

Существует еще некоторая информация об использовании маркера для BLOb доступа ресурсов здесь и здесь и здесь, но я гавань"был в состоянии проверить еще.

Хранилище Azure работает специально с именем учетной записи + ключом (основным или дополнительным). Не существует понятия принципала службы / доступа на основе AD.

Ваш первый пример (настройка конечной точки службы BLOB-объектов) с именем учетной записи + ключом является правильным способом работы.

Примечание: как упоминалось в Zhaoxing, вы также можете использовать SAS. Но с программной точки зрения, при условии, что вы являетесь владельцем учетной записи хранения, на самом деле это вам мало что дает.

Единственное место, в которое вступают Принципы обслуживания (и AD в целом), - это управление самим ресурсом (например, учетной записью хранения с точки зрения развертывания / управления / удаления).

Я не думаю, что служба хранилища Azure поддерживает учетные данные участника службы. На самом деле он принимает только два вида учетных данных: общие ключи и подпись общего доступа (SAS).

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