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

时间:2018-06-13 20:44:44

标签: amazon-web-services elasticsearch elasticsearch-py

我有一个用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连接?

2 个答案:

答案 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的主机名不同,则该连接将无效,因为证书不匹配。