通过 HTTPS 从 Lambda 连接到 VPC 中的 AWS Elasticsearch



我有一个用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 的主机名不同,则该连接将不起作用,因为证书不匹配。

相关内容

  • 没有找到相关文章

最新更新