我有一个用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连接?
答案 0 :(得分: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();
答案 1 :(得分:-1)
您需要使用host
中的.us-west-2.es.amazonaws.com
结尾,因为这是Elasticsearch发送的SSL证书中的域。如果内部DNS的主机名不同,则该连接将无效,因为证书不匹配。