3

我有一个用 Python 编写的 Lambda,它将一些数据写入 AWS 上托管的 Elasticsearch。ES 服务位于 VPC 内,因此我尝试使用 ES 的内部 DNS 连接到它。这是我的代码:

        es_client = Elasticsearch(
            hosts=[{'host': es_host, 'port': 443}],
            http_auth=aws_auth,
            use_ssl=True,
            verify_certs=True,
            connection_class=RequestsHttpConnection
        )

但是,我得到了这个例外:

ssl.CertificateError: hostname 'x.y.internal' doesn't match '*.us-west-2.es.amazonaws.com

我不想使用公共主机名,因为它会不断变化。如何使用其内部 DNS 连接到 ES 服务?

====== 更新 =======

我可以通过以下代码使用 HTTP 连接到 ES 域:

es_client = Elasticsearch(
            hosts=[{'host': es_host, 'port': 80}]
        )

但是如何通过 HTTPS 连接?

4

2 回答 2

0

使用 AWS.HttpClient 遇到了类似的问题。当您通过 https 连接到生成的 ES 的 VPC 端点时会发生这种情况。您必须禁用证书验证:

es_client = Elasticsearch(
    hosts=[{'host': es_host, 'port': 443}],
    http_auth=aws_auth,
    use_ssl=True,
    verify_certs=False,
    connection_class=RequestsHttpConnection
)

如果您像我一样使用 AWS.HttpClient,您必须像这样禁用它:

const AWS = require('aws-sdk');
const https = require('https');
AWS.NodeHttpClient.sslAgent = new https.Agent({ rejectUnauthorized: false });

const httpClient = new AWS.HttpClient();
于 2021-04-08T16:20:18.067 回答
-1

您需要使用host结尾,.us-west-2.es.amazonaws.com因为这是 Elasticsearch 发送的 SSL 证书中的域。如果内部 DNS 的主机名不同,则该连接将无法正常工作,因为证书不匹配。

于 2018-06-14T11:52:52.327 回答