我有一个用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
我不想使用公共主机名,因为它会不断变化。如何使用 ES 服务的内部 DNS 连接到该服务?
====== 更新 =======
我可以使用以下代码使用 HTTP 连接到 ES 域:
es_client = Elasticsearch(
hosts=[{'host': es_host, 'port': 80}]
)
但是如何通过 HTTPS 进行连接?
在使用 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();
您需要使用以.us-west-2.es.amazonaws.com
结尾的host
,因为这是 Elasticsearch 发送的 SSL 证书中的域。如果内部 DNS 的主机名不同,则该连接将不起作用,因为证书不匹配。