首页 > 解决方案 > 通过 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

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

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

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

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

但是如何通过 HTTPS 连接?

标签: amazon-web-serviceselasticsearchelasticsearch-py

解决方案


使用 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();

推荐阅读