Вопрос или проблема
Я не могу подключиться к своему экземпляру 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
.
Решение проблемы:
-
Обновите зависимости: Убедитесь, что у вас установлены последние версии
opensearch-py
иrequests-aws4auth
. В вашем случае версияrequests-aws4auth
(1.3.1) может быть устаревшей. Вы можете обновить свои зависимости, выполнив следующие команды:pip install --upgrade opensearch-py requests-aws4auth
-
Использование
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())
-
Проверьте переменные окружения: Убедитесь, что все необходимые переменные окружения загружены корректно и содержат правильные значения. Это особенно важно для
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
,ES_HOST
,ES_REGION
, и т.д. -
Порт и схема: Убедитесь, что вы используете правильный порт (обычно 443 для HTTPS) и схему (
https
), когда подключаетесь к вашему экземпляру AWS OpenSearch.
После применения данных рекомендаций ваш код должен успешно подключаться к AWS OpenSearch, а ошибка аутентификации должна быть устранена. Если проблема сохраняется, проверьте настройки вашего экземпляра OpenSearch и разрешения на использование API.