首页 >后端开发 >Python教程 >如何使用 python 连接到 AWS OpenSearch 或 Elasticsearch 集群

如何使用 python 连接到 AWS OpenSearch 或 Elasticsearch 集群

DDD
DDD原创
2024-12-20 20:49:13507浏览

How to connect to AWS OpenSearch or Elasticsearch clusters using python

使用 Python 连接到在 AWS 中运行的 OpenSearch (ES) 服务非常痛苦。我在网上找到的大多数示例要么不起作用,要么已经过时,让我不断修复相同的问题。为了节省时间和减少挫败感,这里提供了截至 2024 年 12 月最新的工作代码片段集合。

  • 使用 opensearch-py 库 (OpenSearch ElasticSearch) 连接
  • 使用elasticsearch库连接(仅限ElasticSearch)
    • elasticsearch >= 8
    • 弹性搜索

使用 opensearch-py 库 (OpenSearch ElasticSearch) 连接

这是我连接到 AWS 管理的 ES 实例的首选方式。它适用于 ElasticSearch 和 OpenSearch 集群,并且身份验证可以利用 AWS 配置文件。

安装 opensearch-py 和 boto3(用于身份验证):

pip install opensearch-py boto3

在撰写本文时,这将安装 opensearch-py==2.8.0 和 boto3==1.35.81。

现在,您可以使用以下命令创建客户端:

import boto3

from opensearchpy import (
    AWSV4SignerAuth,
    OpenSearch,
    RequestsHttpConnection,
)

es_host = "search-my-aws-esdomain-5k2baneoyj4vywjseocultv2au.eu-central-1.es.amazonaws.com"
aws_access_key = "AKIAXCUEGTAF3CV7GYKA"
aws_secret_key = "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"
region = "eu-central-1"

# Note: you can also use boto3.Session(profile_name="my-profile") or other ways
session = boto3.Session(
    aws_access_key_id=aws_access_key,
    aws_secret_access_key=aws_secret_key,
    region_name=region,
)

client = OpenSearch(
    hosts=[{"host": es_host, "port": 443}],
    http_auth=AWSV4SignerAuth(session.get_credentials(), region, "es"),
    connection_class=RequestsHttpConnection,
    use_ssl=True,
)

请注意,boto3.Session 支持多种创建会话的方式:使用配置文件、环境变量等。我让你看看!

获得后,请使用以下命令检查连接:

client.ping() # should return True
client.info() # use this to get a proper error message if ping fails

检查索引:

# List all indices
client.cat.indices()
client.indices.get("*")

# Check the existence of an indice
client.indices.exists("my-index")

使用elasticsearch库连接(仅限ElasticSearch)

?这仅适用于 ElasticSearch 集群!连接到 OpenSearch 集群会引发

UnsupportedProductError:客户端注意到服务器不是 Elasticsearch,我们不支持此未知产品

弹性搜索>= 8

大多数代码片段仍然引用 RequestsHttpConnection,该类已在 elasticsearch 8.X 中删除。如果您在谷歌上搜索错误无法从“elasticsearch”导入名称“RequestsHttpConnection”,那么您来对地方了!

安装elasticsearch(这也应该安装elastic-transport)和requests_aws4auth。后者根据请求需要处理 AWS 的身份验证:

pip install elasticsearch requests-aws4auth

在撰写本文时,这将安装 elastic-transport==8.15.1、elasticsearch==8.17.0 和 requests-aws4auth==1.3.1。

现在,您可以使用以下命令创建客户端:

from elastic_transport import RequestsHttpNode
from elasticsearch import Elasticsearch
from requests_aws4auth import AWS4Auth

es_endpoint = "search-my-aws-esdomain-5k2baneoyj4vywjseocultv2au.eu-central-1.es.amazonaws.com"
aws_access_key = "AKIAXCUEGTAF3CV7GYKA"
aws_secret_key = "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"
region = "eu-central-1"

es = Elasticsearch(
    f"https://{es_host}",
    http_auth=AWS4Auth(
        aws_access_key, 
        aws_secret_key, 
        region,
        "es",
    ),
    verify_certs=True,
    node_class=RequestsHttpNode,
)

获得后,请使用以下命令检查连接:

es.ping() # should return True
es.info() # use this to get a proper error message if ping fails

弹性搜索

如果您仍在使用旧版本的elasticsearch:

pip install "elasticsearch<8" requests-aws4auth

当前elasticsearch==7.17.12,requests-aws4auth==1.3.1。

现在,您可以使用以下命令创建客户端:

pip install opensearch-py boto3

检查连接:

import boto3

from opensearchpy import (
    AWSV4SignerAuth,
    OpenSearch,
    RequestsHttpConnection,
)

es_host = "search-my-aws-esdomain-5k2baneoyj4vywjseocultv2au.eu-central-1.es.amazonaws.com"
aws_access_key = "AKIAXCUEGTAF3CV7GYKA"
aws_secret_key = "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"
region = "eu-central-1"

# Note: you can also use boto3.Session(profile_name="my-profile") or other ways
session = boto3.Session(
    aws_access_key_id=aws_access_key,
    aws_secret_access_key=aws_secret_key,
    region_name=region,
)

client = OpenSearch(
    hosts=[{"host": es_host, "port": 443}],
    http_auth=AWSV4SignerAuth(session.get_credentials(), region, "es"),
    connection_class=RequestsHttpConnection,
    use_ssl=True,
)

以上是如何使用 python 连接到 AWS OpenSearch 或 Elasticsearch 集群的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn