Как подключиться к хранилищу таблицы CosmosDB Emulator с помощью python? - PullRequest
0 голосов
/ 09 апреля 2019

Я запускаю эмулятор Azure CosmosDB локально и хочу использовать интерфейс Table из Python.Microsoft предоставляет SDK Azure-CosmosDB-Table Python для подключения к Table API [1].Я не могу заставить соединения работать успешно с эмулятором, хотя я могу подключиться к реальной учетной записи CosmosDB в облаке.

Номера версий и т. Д .:

  • Windows 10
  • Python 3.6 (CPython)
  • azure-cosmosdb-table 1.0.5

Код, который я использую для доступа к эмулятору:

import logging
from azure.cosmosdb.table import TableService

from nossl import no_ssl_verification

logging.basicConfig(level=logging.DEBUG)

connection = {
    'AccountName': 'devstoreaccount1',
    # 'AccountEndpoint': 'https://localhost:8081/',
    'AccountKey': 'C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="',
    # 'EndpointSuffix': 'localhost:8081',
    # 'DefaultEndpointsProtocol': 'https',
    'TableEndpoint': 'https://localhost:8081',
}
connection_string = ';'.join('{k}={v}'.format(k=k, v=v) for k, v in connection.items())
print(connection_string)

with no_ssl_verification():
    ts = TableService(
        endpoint_suffix = "https://localhost:8081",
        connection_string= connection_string,
        is_emulated=True)
    ts.create_table('mytable')

Диспетчер контекста no_ssl_verification отключает все проверки SSL в библиотеке запросов, которая используется SDK.Он был скопирован из ответа здесь, в Переполнении стека [5].

Приведенный выше пример кода приводит к следующей ошибке:

AccountName=devstoreaccount1;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==";TableEndpoint=https://localhost:8081
DEBUG:azure.cosmosdb.table._auth:String_to_sign=POST

application/json
Thu, 18 Apr 2019 13:50:42 GMT
/devstoreaccount1/Tables
INFO:azure.storage.common.storageclient:Client-Request-ID=f52a8b36-61e0-11e9-8fc0-a44cc8cee022 Outgoing request: Method=POST, Path=/Tables, Query={'timeout': None}, Headers={'Content-Type': 'application/json', 'Prefer': 'return-no-content', 'Accept': 'application/json;odata=minimalmetadata', 'DataServiceVersion': '3.0;NetFx', 'MaxDataServiceVersion': '3.0', 'Content-Length': '24', 'x-ms-version': '2018-03-28', 'User-Agent': 'Azure-Storage/1.4.0-None (Python CPython 3.6.4;
Windows 10)', 'x-ms-client-request-id': 'f52a8b36-61e0-11e9-8fc0-a44cc8cee022', 'x-ms-date': 'Thu, 18 Apr 2019 13:50:42 GMT', 'Authorization': 'REDACTED'}.
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): localhost:8081
DEBUG:urllib3.connectionpool:https://localhost:8081 "POST /Tables HTTP/1.1" 400 None
INFO:azure.storage.common.storageclient:Client-Request-ID=f52a8b36-61e0-11e9-8fc0-a44cc8cee022 Receiving Response: Server-Timestamp=Thu, 18 Apr 2019 13:50:42 GMT, HTTP Status Code=400, Message=Bad Request, Headers={'transfer-encoding': 'chunked', 'content-type': 'application/json', 'server': 'Microsoft-HTTPAPI/2.0',
'x-ms-activity-id': '00000000-0000-0000-0000-000000000000', 'x-ms-gatewayversion': 'version=2.2.0.0', 'date': 'Thu, 18 Apr 2019 13:50:42 GMT'}.
INFO:azure.storage.common.storageclient:Client-Request-ID=f52a8b36-61e0-11e9-8fc0-a44cc8cee022 Operation failed: checking if the operation should be retried. Current retry count=0, Server-Timestamp=Thu, 18 Apr 2019 13:50:42 GMT, HTTP status code=400, Exception=Bad Request{"code":"BadRequest","message":"Request url is invalid., Microsoft.Azure.Documents.Common/2.2.0.0"}.
ERROR:azure.storage.common.storageclient:Client-Request-ID=f52a8b36-61e0-11e9-8fc0-a44cc8cee022 Retry policy did not allow for a retry: Server-Timestamp=Thu, 18 Apr 2019 13:50:42 GMT, HTTP status code=400, Exception=Bad Request{"code":"BadRequest","message":"Request url is invalid., Microsoft.Azure.Documents.Common/2.2.0.0"}.
Traceback (most recent call last):
  File "c:/Users/josteb/sandbox/cosmoskvstore/examples.py", line 24, in <module>
    ts.create_table('mytable')
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\cosmosdb\table\tableservice.py", line 539, in create_table
    _dont_fail_on_exist(ex)
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\storage\common\_error.py", line 88, in _dont_fail_on_exist
    raise error
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\cosmosdb\table\tableservice.py", line 536, in create_table
    self._perform_request(request)
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\cosmosdb\table\tableservice.py", line 1106, in _perform_request
    return super(TableService, self)._perform_request(request, parser, parser_args, operation_context)
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\storage\common\storageclient.py", line 430, in _perform_request
    raise ex
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\storage\common\storageclient.py", line 358, in _perform_request
    raise ex
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\storage\common\storageclient.py", line 344, in _perform_request
    HTTPError(response.status, response.message, response.headers, response.body))
  File "C:\Users\josteb\.virtualenvs\cosmoskvstore-cPSP36p_\lib\site-packages\azure\storage\common\_error.py", line 115, in _http_error_handler
    raise ex
azure.common.AzureHttpError: Bad Request
{"code":"BadRequest","message":"Request url is invalid., Microsoft.Azure.Documents.Common/2.2.0.0"}

Мне не удалось найти параметры подключения, которые должны бытьиспользуется для эмулятора, правильно задокументирован везде.Веб-интерфейс эмулятора предоставляет имя учетной записи и ключ учетной записи.Остальное - это предположение, к которому я пришел с помощью экспериментов.Без этих дополнительных параметров из выходных данных журнала я вижу, что SDK пытается связаться с удаленным хостом (вероятно, частью облачной службы Cosmos), что, конечно, дает сбой.То же самое касается флага is_emulated;когда False, устанавливаются соединения с удаленным хостом.

Чтобы проверить, было ли что-то не так с эмулятором, я попытался использовать Azure-Cosmos SDK для интерфейса SQL / document в cosmosdb для доступа кэмулятор.Это прекрасно работает со следующим кодом:

from azure.cosmos.cosmos_client import CosmosClient

cc = CosmosClient('https://localhost:8081', auth={'masterKey': 'C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=='})
cc.CreateDatabase({'id': 'mydb'})

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

У кого-нибудь есть ссылкаправильная строка подключения для интерфейса таблицы эмулятора CosmosDB?

[1] https://docs.microsoft.com/en-us/python/api/azure-cosmosdb-table/?view=azure-python

[2] https://docs.microsoft.com/en-us/python/api/azure-cosmos/?view=azure-python

[3] https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator-export-ssl-certificates

[4] https://bugs.python.org/issue28547

[5] Как отключить проверку сертификата безопасности в запросах Python

1 Ответ

0 голосов
/ 12 апреля 2019

Способ отключить проверку сертификата в Python SDK для таблицы. хранение

После глубокой отладки функции create_table я обнаружил, что вы можете использовать свойство verify в файле session.py в пакете запросов.

enter image description here

Значением по умолчанию является True, вы можете установить его как False, чтобы пропустить проверку SSL.

Способ подтверждения сертификатов

Другое свойство с именем cert, которое можно настроить как путь к сертификату.

enter image description here

Кроме того, пожалуйста, обратитесь к предложениям в этом документе и этой ssl конфигурации .

enter image description here

...