amazon-web-services - 通过 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 连接?
解决方案
使用 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();
推荐阅读
- apache-kafka - 如何更改 Kafka Rest Proxy CURL 命令以便在浏览器中使用它
- python - 为什么访问外部范围中定义的变量需要全局关键字?
- ansible - 当条件下跳过剧本任务
- python-3.x - WTForms 不验证输入
- c# - System.IndexOutOfRangeException C# 中的 SQL Server 查询
- javascript - 通过使用 LODASH 比较 2 个数组来寻找缺失的信息
- clang - 如何从 clang 分析器中获取爆炸图
- android - 如何防止启动新活动以完成任务?
- python - python selenium chrome驱动程序进程超过系统pid max,如何杀死它们?
- angular - Angular 在 URL 中设置标题而不是 id