AWS MWAA公网模式下调用EMR Livy REST接口出现连接超时问题
问题根因
你使用公网模式创建的MWAA环境默认运行在AWS托管的公网网络中,无法直接访问你账号VPC内的资源:你代码中拿到的EMR Master节点域名是VPC内网私有域名,公网环境既无法解析该域名,也没有到该内网地址的链路,所以会触发连接超时报错。
解决方案
优先选择更安全的内网打通方案,如仅测试使用可选择临时公网暴露方案:
- 方案1(生产环境推荐):将MWAA切换为VPC私有部署模式
- 重新创建MWAA环境时,选择和EMR集群部署在同一个VPC下,至少选择2个私有子网,配置对应安全组
- 配置安全组规则:EMR Master节点的安全组添加入站规则,放行MWAA安全组作为来源的8998端口访问请求,同时确保MWAA安全组的出站规则允许访问该端口
- 确认VPC已开启私有DNS解析功能,同VPC内私有域名可正常解析
- 若EMR和MWAA部署在不同VPC,需要额外配置VPC对等连接或中转网关,打通两个VPC的网络链路
- 方案2(仅测试环境临时使用):保留公网模式MWAA,暴露Livy公网访问
- 给EMR Master节点绑定公网IP,修改EMR安全组入站规则,放行MWAA公网出口IP段的8998端口访问请求
- 调整原有DAG代码,调用EMR API获取Master节点的公网DNS地址,替换原有内网DNS地址拼接Livy请求地址
- 该方案会将Livy接口暴露到公网,存在安全风险,生产环境禁止使用
连通性校验
配置完成后可先在DAG中新增一个简单的测试PythonOperator,执行端口连通性校验,确认链路正常后再运行原有业务任务:
import socket def test_connect(host, port=8998): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5) result = sock.connect_ex((host, port)) if result == 0: print(f"端口{port}连通正常") else: print(f"端口{port}连通失败,错误码{result}") sock.close()
内容的提问来源于stack exchange,提问作者Grish
相关产品推荐
相关产品推荐

