AWS Glue从Redshift取数生成Parquet至S3时反向DNS解析失败
我之前帮同事排查过几乎一模一样的Glue与Redshift集成故障,结合你已经排除的Route53、安全组入站、同区域配置这些点,给你几个针对性的调试和解决方向:
检查Glue Redshift连接的端点配置
确保你在Glue连接里填写的Redshift JDBC URL用的是集群官方提供的DNS端点(比如your-cluster-name.xxxxxx.us-east-1.redshift.amazonaws.com),而不是手动输入的私有IP地址。如果直接用IP,Glue worker在建立连接时会触发反向DNS验证,而IP本身没有对应的反向解析记录,就会抛出这个错误。验证VPC的DNS核心配置
虽然你说和Route53无关,但VPC的DNS基础开关必须开启:- 进入VPC控制台,找到你的VPC,确认DNS解析设置为「启用」
- 同时确认DNS主机名也设置为「启用」
Redshift的集群私有域名是由Route53私有托管区管理的,只有开启这两个选项,VPC内的Glue worker才能正确解析集群域名,反向解析流程也才能正常进行。
测试Glue Worker的DNS解析能力
你可以在Glue作业的开头加入一段调试代码,直接验证worker的DNS解析和反向解析能力,定位具体失败环节:import subprocess import socket # 测试Redshift集群端点的正向DNS解析 redshift_endpoint = "your-redshift-cluster-endpoint" forward_lookup = subprocess.run(['nslookup', redshift_endpoint], capture_output=True, text=True) print("正向解析结果:\n", forward_lookup.stdout) if forward_lookup.stderr: print("正向解析错误:\n", forward_lookup.stderr) # 测试当前worker IP的反向DNS解析 worker_ip = socket.gethostbyname(socket.gethostname()) reverse_lookup = subprocess.run(['nslookup', worker_ip], capture_output=True, text=True) print("\n反向解析结果:\n", reverse_lookup.stdout) if reverse_lookup.stderr: print("反向解析错误:\n", reverse_lookup.stderr)运行作业后查看日志,如果正向解析失败,说明VPC DNS配置有问题;如果反向解析失败,那大概率是Redshift端的反向DNS验证规则导致的。
调整Redshift的反向DNS验证参数
如果测试发现是worker IP反向解析失败,而你确认VPC内的连接都是可信的,可以临时调整Redshift参数组来关闭反向DNS验证:- 进入Redshift控制台,找到你的集群使用的参数组
- 修改参数
require_reverse_dns为false - 重启Redshift集群使参数生效
注意:这个调整会降低连接的安全性,只建议在VPC内完全可信的环境下使用,后续如果有必要,可以给Glue worker的IP段添加反向解析记录来恢复验证。
检查Redshift安全组的出站DNS访问权限
最后确认Redshift的安全组允许出站访问UDP 53端口(DNS服务端口),目标地址为VPC的DNS服务器(通常是VPC网段的第二个IP,比如10.0.0.2)。Redshift在做反向DNS验证时需要访问DNS服务,如果出站被拦截,也会导致解析失败。
内容的提问来源于stack exchange,提问作者Anant Goswami

