Создайте Python `BlobClient.from_blob_url` с помощью эмулятора хранилища Azure?

#python #azure-functions #azure-storage #azure-storage-emulator

Вопрос:

Я пытаюсь использовать эмулятор хранилища Azure в следующем сценарии:

  1. Большой двоичный объект, загруженный в эмулируемый контейнер
  2. Эмулированное сообщение сетки событий, созданное при загрузке большого двоичного объекта
  3. Эмулируемое хранилище очередей получает сообщение Сетки событий
  4. Локально запущенная функция Azure запускается из сообщения хранилища очередей

Вопрос:

1 выше. Работает нормально (эмулятор запущен и работает)

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

  • Вместо этого я создаю сообщение Сетки событий вручную с именем загруженного большого двоичного объекта
 {
    "id": "<long-guid>",
    "data": {
        "api": "FlushWithClose",
        "clientRequestId": "<long-guid>",
        "requestId": "<long-guid>",
        "eTag": "0x8D9430B96888008",
        "contentType": "application/octet-stream",
        "contentLength": 4633473584,
        "contentOffset": 0,
        "blobType": "BlockBlob",
        "blobUrl": "http://127.0.0.1:10000/devstoreaccount1/test/710520200429.csv",
        "url": "http://127.0.0.1:10000/devstoreaccount1/test/710520200429.csv",
        "sequencer": "0000000000000000000000000000933600000000000023c7",
        "identity": "<long-guid>",
        "storageDiagnostics": {
            "batchId": "<long-guid>"
        }
    },
    "topic": "/subscriptions/<long-guid>/resourceGroups/DEV/providers/Microsoft.Storage/storageAccounts/fa00001dev",
    "subject": "/blobServices/default/containers/test/blobs/710520200429.csv",
    "event_type": "Microsoft.Storage.BlobCreated"
}
 
  • Затем создайте новое сообщение в хранилище очереди эмулятора и вставьте его (в основном 3. выше).

4 выше. Функция запускается, но не может выполнить следующий фрагмент кода:

 credentials = DefaultAzureCredential()

def create_blob_client(credentials):
        try:
            blob_client = BlobClient.from_blob_url(eg_msg_json['data']['blobUrl'], credentials, max_single_get_size = 256*1024*1024, max_chunk_get_size = 128*1024*1024)
            logging.info(f'####### Successfully created BlobClient #######')
        except:
            logging.error(f'####### Failed to create BlobClient  #######')
            logging.error(f'####### Blob URL: {eg_msg_json["data"]["blobUrl"]}  #######')
        return blob_client
 
  • Потому blobUrl http://127.0.0.1:10000/devstoreaccount1/test/710520200429.csv что значение либо неверно, либо BlobClient.from_blob_url оно не позволяет BlobClient создавать a из эмулятора.

Ошибка:

 [2021-07-31T00:23:01.397Z] ManagedIdentityCredential will use IMDS
[2021-07-31T00:23:01.405Z] Executed 'Functions.fa00003' (Failed, Id=55f8ce9e-08b5-41e2-bd61-d753da0d72e1, Duration=47ms)
[2021-07-31T00:23:01.410Z] System.Private.CoreLib: Exception while executing function: Functions.fa00003. System.Private.CoreLib: Result: Failure
Exception: ValueError: Invalid tenant id provided. You can locate your tenant id by following the instructions here: https://docs.microsoft.com/partner-center/find-ids-and-domain-names
Stack:   File "C:UserstestAppDataRoamingnpmnode_modulesazure-functions-core-toolsbinworkerspython3.8WINDOWSX64azure_functions_workerdispatcher.py", line 398, in _handle__invocation_request
    call_result = await self._loop.run_in_executor(
  File "C:UserstestAppDataLocalProgramsPythonPython38libconcurrentfuturesthread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "C:UserstestAppDataRoamingnpmnode_modulesazure-functions-core-toolsbinworkerspython3.8WINDOWSX64azure_functions_workerdispatcher.py", line 602, in _run_sync_func        
    return ExtensionManager.get_sync_invocation_wrapper(context,
  File "C:UserstestAppDataRoamingnpmnode_modulesazure-functions-core-toolsbinworkerspython3.8WINDOWSX64azure_functions_workerextension.py", line 215, in _raw_invocation_wrapper    result = function(**args)
  File "C:UserstestDesktopgitAzureFunctionsfa00003fa00003__init__.py", line 132, in main
    credentials = DefaultAzureCredential()
  File "C:UserstestDesktopgitAzureFunctionsfa00003.venvlibsite-packagesazureidentity_credentialsdefault.py", line 123, in __init__
    credentials.append(VisualStudioCodeCredential(tenant_id=vscode_tenant_id))
  File "C:UserstestDesktopgitAzureFunctionsfa00003.venvlibsite-packagesazureidentity_credentialsvscode.py", line 43, in __init__
    validate_tenant_id(self._tenant_id)
  File "C:UserstestDesktopgitAzureFunctionsfa00003.venvlibsite-packagesazureidentity_internal__init__.py", line 40, in validate_tenant_id
    raise ValueError(
.
 

Кто-нибудь может сказать мне, что здесь правильно?

Комментарии:

1. Пожалуйста, отредактируйте свой вопрос и включите 2 вещи: 1) Как вы создаете credentials ? и 2) Подробная информация об исключении, которое вы получаете.

2. Обновлено credentials и получено исключение.

3. Сообщение об ошибке содержит жалобу на неверный идентификатор арендатора. Вы можете это проверить? Кроме того, если вы используете Azurite , пожалуйста, убедитесь, что вы инициализируете с помощью azurite --oauth basic --cert certname.pem --key certname-key.pem команды.

4. Да, я tenant id нигде не использую Функциональный код. Я предполагаю, что это часть DefaultCredentials() внутренних органов. Я не использую Azurite , а скорее Azure Storage Emulator v5.10.0.0 использую .