OpenSearch python 客户端身份验证错误

问题描述 投票:0回答:1

我无法连接到我的 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
  • 请求-aws4auth:1.3.1
  • urllib3:19年1月26日
python amazon-web-services elasticsearch urllib opensearch
1个回答
0
投票

我相信您需要在 OpenSearch 客户端中使用

RequestsHttpConnection
类才能使用
requests_aws4auth
库。现在,看起来
opensearch-py
默认使用
http_urllib3

将代码更改为:

import os
from dotenv import load_dotenv
from opensearchpy import OpenSearch, helpers, RequestsHttpConnection
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,
    connection_class=RequestsHttpConnection,
    )

print(es.cluster.health())
© www.soinside.com 2019 - 2024. All rights reserved.