Функция Python в Azure: ошибка авторизации blobclient.upload_blob

У меня есть функция python azure, которая запускает сообщение очереди и загружает json в хранилище BLOB-объектов. Я получаю ошибки аутентификации на blob.client с использованием URL-адреса SAS учетной записи хранения и токена SAS, а также строки подключения учетной записи хранения

код функции: символ #, используемый при переключении между экземплярами blobclients

import json
import requests
import azure.functions as func
from azure.storage.blob import BlobClient

def main(msg: func.QueueMessage) -> None:
             queuedata =  msg.get_body().decode('utf-8')
             data = json.loads(queuedata)
             url = data['data']['url']

             r = requests.get(url)
             data = r.text


             s1, s2 = (data.split(sep=';', maxsplit=1))
             s1 = ''.join(s1.split())

             dict1 = json.loads(s1)
             dict1 = json.loads(s2)
             mergedJson = {**dict1, **dict1}


             #connectionstring = "DefaultEndpointsProtocol=https;AccountName=XXXXXX;AccountKey=XXXXXXXX/Jm4OPgSzWOju5hD/+XA4QXXXXXXfNEbUxuO9WoUQ7xn91cE3qlQeqRoHJx3SrJ+bdln9Q==;EndpointSuffix=core.windows.net"

             sas_url = 'https://XXXXX.blob.core.windows.net/?sv=2019-10-10&ss=bq&srt=c&sp=rwdlacupx&se=2020-06-13T04:48:27Z&st=2020-06-12T20:48:27Z&spr=https&sig=1j2a6pQUFLI1B71D8oRoALHYgpF82pMiXbvrdZCY7gk%3D'
             sas_token = '?sv=XXXXXXXXXX-10-10&ss=XXXXX&XXX=c&sp=rwdlacupx&se=2020-06-13T04:48:27Z&st=2020-06-12T20:48:27Z&spr=https&sig=1j2a6pQUFLI1B71D8oRoALHYgpF82pMiXbvrdZCY7gk%3D'


             filename = dictA['FormId'] + '.json'
             #blob_client = BlobClient.from_connection_string(conn_str= connectionstring,  container_name='json', content_type='application/json', blob_name= filename)
             #blob_client.upload_blob(mergedJson, blob_type='BlockBlob')

             blob_client2 = BlobClient(account_url= sas_url, credential= sas_token, container_name='json', blob_name= filename, content_type='application/json')
             blob_client2.upload_blob(mergedJson, blob_type='BlockBlob')

При ошибке строки подключения с использованием BlobClient.from_connection_string (conn_str, container_name, blob_name, snapshot = None, credential = None, ** kwargs):

Результат: Ошибка. Исключение: ClientAuthenticationError: серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись. RequestId: cdccbb2e-e01e-0007-6cfd-40c024000000 Время: 2020-06-12T21: 09: 22.1504720Z ErrorCode: AuthenticationFailed Ошибка: нет AuthenticationErrorDetail: MAC-подпись, найденная в HTTP-запросе 'n + oKBbFHSn12Nhw3SIGLax3Ox, не такая же, как' любая вычисленная подпись. Сервер использовал следующую строку для подписи: 'PUT 302 application / octet-stream * x-ms-blob-type: BlockBlob x-ms-client-request-id: fcba350c-acf0-11ea-b094-0242ac100105 x-ms-date: Пт, 12 июн 2020 21:09:22 GMT x-ms-version: 2019-07-07 /dmgenhwr/json/C1234567.json '. Стек: файл «/azure-functions-host/workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py», строка 315, в _handle__invocation_request self. run_sync_func, invocation_id, fi.func, args) File » /usr/local/lib/python3.7/concurrent/futures/thread.py ", строка 57, результат выполнения = self.fn (* self.args, ** self.kwargs) Файл" / azure-functions-host /workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py ", строка 434, в __run_sync_func return func (** params) File" / home / site / wwwroot / TextQueue / __ init .py ", строка 32 в основном файле blob_client.upload_blob (mergedJson, blob_type = 'BlockBlob') File "/home/site/wwwroot/.python_packages/lib/site-packages/azure/core/tracing/decorator.py", строка 83, в wrapper_use_tracer return func (* args, ** kwargs) Файл "/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_blob_client.py", строка 496, в upload_blob return upload_block_blob (** options) Файл "/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_uploa d_helpers.py ", строка 153, в файле upload_block_blob process_storage_error (error)" /home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_shared/response_handlers.py ", строка 147_error_storage поднять ошибку

при ошибке URL-адреса SAS и токена SAS с использованием BlobClient (account_url, container_name, blob_name, snapshot = None, credential = None, ** kwargs):

Результат: исключение сбоя: HttpResponseError: этот запрос не авторизован для выполнения этой операции с использованием этого типа ресурса. RequestId: 62bb329f-b01e-0036-19fb-409bf3000000 Время: 2020-06-12T20: 56: 14.5723115Z ErrorCode: AuthorizationResourceTypeMismatch Ошибка: нет Стек: файл "/azure-functions-host/workers/python/3.7/LINUX/X64/ azure_functions_worker / dispatcher.py ", строка 315, в _handle__invocation_request self. run_sync_func, invocation_id, fi.func, args) Файл" /usr/local/lib/python3.7/concurrent/futures/thread.py ", строка 57, при запуске result = self.fn (* self.args, ** self.kwargs) Файл "/azure-functions-host/workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py", строка 434, в __run_sync_func return func (** params) File "/ home / site / wwwroot / TextQueue / __ init .py", строка 35, в основном файле blob_client2.upload_blob (mergedJson, blob_type = 'BlockBlob') File "/ home /site/wwwroot/.python_packages/lib/site-packages/azure/core/tracing/decorator.py ", строка 83, в wrapper_use_tracer return func (* args, ** kwargs) File" / home / site / wwwroot /. python_packages / lib / site-packages / azure / storage / blob / _blob_client.py ", строка 496, в upload_blob return upload_block_blob (** options) File "/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_upload_helpers.py", строка 153, в файле upload_block_blob process_storage_error (error) File " home / site / wwwroot / .python_packages / lib / site-packages / azure / storage / blob / _shared / response_handlers.py ", строка 147, ошибка вызова process_storage_error

Я сослался на класс Azure Storage BlobClient

Требуется ли для этой функции метод действия Http для PUT? Я не вижу ссылки в лазурном SDK для python. Любое руководство приветствуется.


person GLarose    schedule 12.06.2020    source источник


Ответы (1)


Следуя руководству Использование библиотек Azure с хранилищем Azure Я добавил azure-identity и выполнил настройку аутентификации по принципу службы «4a: Используйте хранилище BLOB-объектов с аутентификацией».

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

Моя первая попытка заключалась в том, чтобы воспользоваться рекомендациями из «4b: Использовать хранилище BLOB-объектов со строкой подключения», но безуспешно. Используя принцип обслуживания и следуя указаниям система назначила управляемую идентификацию и разрешила доступ к blob, похоже, решил эту проблему.

Теперь вы столкнулись с тем, что «зависимость PyGObject отсутствует во время выполнения» - прыжок через обруч для установки функции python azure - это НЕ весело.

person GLarose    schedule 13.06.2020