AWS Lambda连接ES Domain出现ConnectionTimeout报错问题咨询
排查解决步骤
按照优先级从高到低依次排查:
1. 网络连通性排查(90%以上的VPC型ES连接超时都是该类问题)
- 确认Lambda是否部署在与VPC型ES完全相同的VPC内:未配置VPC的Lambda默认走公网网络,无法访问内网VPC内的ES资源,必须为Lambda配置和ES同VPC的子网。
- 检查安全组规则:
- Lambda关联的安全组出站规则需要放开目标为ES安全组/ES所在网段、端口为443的TCP访问
- ES关联的安全组入站规则需要放开源为Lambda安全组/Lambda所在网段、端口为443的TCP访问
- 检查VPC网络ACL:确认Lambda和ES所在子网的ACL没有拦截双向443端口的流量。
2. 配置正确性排查
- 核对Lambda环境变量
esDomain的值:确认和ES控制台给出的端点完全一致,不要带https://前缀、路径后缀等多余内容,仅填写纯域名即可。 - 检查ES集群状态:登录AWS ES控制台确认集群运行状态为绿色,无节点故障、集群阻塞类问题。
- 检查ES域访问策略:确认策略规则未禁止Lambda的执行角色、或Lambda所在网段访问ES资源。
3. 代码逻辑优化
当前代码中凭据是全局初始化的,特殊场景下可能出现token过期问题,建议将凭据获取逻辑移入connectES函数内,示例修改如下:
import os import boto3 from elasticsearch import Elasticsearch, RequestsHttpConnection from requests_aws4auth import AWS4Auth host = os.environ['esDomain'] print("ES DOMAIN IS..........", host) region = os.environ['AWS_REGION'] service = 'es' def connectES(): credentials = boto3.Session().get_credentials() print('Connecting to the ES Endpoint {0}'.format(host)) awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) try: es = Elasticsearch( hosts=[{'host': host, 'port': 443}], http_auth=awsauth, use_ssl=True, timeout=30, verify_certs=True, connection_class=RequestsHttpConnection) return es except Exception as E: print("Unable to connect to {0}".format(host)) print(E) exit(3) es = connectES() print("sucess seting up es")
- 确认你使用的
elasticsearchPython SDK版本与ES集群的大版本匹配:大版本差异过大可能引发未知连接异常。
内容的提问来源于stack exchange,提问作者aa16034
相关产品推荐
相关产品推荐

