Ошибка аутентификации клиента Python OpenSearch

Вопрос или проблема

Я не могу подключиться к своему экземпляру AWS OpenSearch. Вот код и соответствующая ошибка. Переменные окружения загружены правильно. Я пробовал клиент elasticsearch, но он, похоже, не поддерживает AWS-аутентификацию теперь, когда RequestsHttpConnection был удален.

import os
from dotenv import load_dotenv
from opensearchpy import OpenSearch, helpers
from requests_aws4auth import AWS4Auth

load_dotenv()

host = os.environ.get("ES_HOST")
region = os.environ.get("ES_REGION")
service = os.environ.get("ES_SERVICE")
port = os.environ.get("ES_PORT")
index = os.environ.get("ES_INDEX")
access_key = os.environ.get("AWS_ACCESS_KEY_ID")
secret_key = os.environ.get("AWS_SECRET_ACCESS_KEY")

awsauth = AWS4Auth(access_key, secret_key, region, 'es')

es = OpenSearch(
    hosts=[{'host': host, 'port': port, 'scheme': 'https'}],
    http_auth=awsauth,
    use_ssl=True,
    verify_certs=True,
    )

print(es.cluster.health())
Traceback (most recent call last):
  File "/repo/.venv/lib/python3.9/site-packages/opensearchpy/connection/http_urllib3.py", line 276, in perform_request
    request_headers.update(self.http_auth(method, full_url, body))
TypeError: __call__() takes 2 positional arguments but 4 were given

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/repo/scratch/test_new.py", line 26, in <module>
    print(es.cluster.health())
  File "/repo/.venv/lib/python3.9/site-packages/opensearchpy/client/utils.py", line 176, in _wrapped
    return func(*args, params=params, headers=headers, **kwargs)
  File "/repo/.venv/lib/python3.9/site-packages/opensearchpy/client/cluster.py", line 131, in health
    return self.transport.perform_request(
  File "/repo/.venv/lib/python3.9/site-packages/opensearchpy/transport.py", line 453, in perform_request
    raise e
  File "/repo/.venv/lib/python3.9/site-packages/opensearchpy/transport.py", line 416, in perform_request
    status, headers_response, data = connection.perform_request(
  File "/repo/.venv/lib/python3.9/site-packages/opensearchpy/connection/http_urllib3.py", line 295, in perform_request
    raise ConnectionError("N/A", str(e), e)
opensearchpy.exceptions.ConnectionError: ConnectionError(__call__() takes 2 positional arguments but 4 were given) caused by: TypeError(__call__() takes 2 positional arguments but 4 were given)

Версия Python: 3.9.12

Версии пакетов:

  • opensearch-py: 2.7.1
  • requests-aws4auth: 1.3.1
  • urllib3: 1.26.19

Ответ или решение

Ошибка, с которой вы столкнулись, происходит из-за несовместимости между библиотекой requests-aws4auth и клиентом opensearch-py. Ваша версия клиента opensearch-py (2.7.1) не поддерживает ту же структуру аутентификации, что и requests-aws4auth, что и приводит к возникновению ошибки TypeError.

Решение проблемы:

  1. Обновите зависимости: Убедитесь, что у вас установлены последние версии opensearch-py и requests-aws4auth. В вашем случае версия requests-aws4auth (1.3.1) может быть устаревшей. Вы можете обновить свои зависимости, выполнив следующие команды:

    pip install --upgrade opensearch-py requests-aws4auth
  2. Использование requests-aws4auth с правильным клиентом: Измените ваш код, чтобы использовать аутентификацию AWS корректно. В вашем случае ошибка возникает из-за неправильного назначения параметров, передаваемых в AWS4Auth. Убедитесь, что вы правильно импортируете и используете библиотеку:

    Вот пример кода, который работает с AWS OpenSearch:

    import os
    from dotenv import load_dotenv
    from opensearchpy import OpenSearch, AWSV4SignerAuth
    
    load_dotenv()
    
    host = os.environ.get("ES_HOST")
    region = os.environ.get("ES_REGION")
    index = os.environ.get("ES_INDEX")
    access_key = os.environ.get("AWS_ACCESS_KEY_ID")
    secret_key = os.environ.get("AWS_SECRET_ACCESS_KEY")
    
    # Создаем AWSV4SignerAuth для аутентификации
    awsauth = AWSV4SignerAuth(access_key, secret_key, region, 'es')
    
    es = OpenSearch(
       hosts=[{'host': host, 'port': 443, 'scheme': 'https'}],  # Порт по умолчанию для HTTPS - 443
       http_auth=awsauth,
       use_ssl=True,
       verify_certs=True,
    )
    
    # Проверяем здоровье кластера
    print(es.cluster.health())
  3. Проверьте переменные окружения: Убедитесь, что все необходимые переменные окружения загружены корректно и содержат правильные значения. Это особенно важно для AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, ES_HOST, ES_REGION, и т.д.

  4. Порт и схема: Убедитесь, что вы используете правильный порт (обычно 443 для HTTPS) и схему (https), когда подключаетесь к вашему экземпляру AWS OpenSearch.

После применения данных рекомендаций ваш код должен успешно подключаться к AWS OpenSearch, а ошибка аутентификации должна быть устранена. Если проблема сохраняется, проверьте настройки вашего экземпляра OpenSearch и разрешения на использование API.

Оцените материал
Добавить комментарий

Капча загружается...