EMR Serverless中使用requests库无法访问公开API的问题
以下是针对你遇到的连接超时问题的排查方向和验证步骤:
EMR Serverless公网访问权限未开启
即使未配置自定义VPC,EMR Serverless默认的托管网络环境也需要手动开启公网访问权限才能访问外部API。你可以在提交作业时,通过控制台或CLI的作业配置中开启"Allow public network access"选项,同时确保作业执行角色拥有允许出站访问公网的权限策略。DNS解析失败
EMR Serverless托管网络的DNS服务可能无法正确解析目标域名vpic.nhtsa.dot.gov。可以在EMR Serverless作业中添加调试命令,比如执行nslookup vpic.nhtsa.dot.gov或dig vpic.nhtsa.dot.gov,检查是否能得到正确的IP地址。如果解析失败,可能需要确认EMR Serverless的网络DNS配置是否正常,或者尝试直接使用目标API的IP地址发起请求(仅临时测试,不推荐长期使用,因为IP可能变动)。请求超时参数设置不合理
EMR Serverless的网络链路延迟可能比Lambda或本地环境更高,若代码中未设置明确的超时时间,或超时阈值设置过短,就容易触发超时。尝试在requests请求中添加合理的超时参数,示例代码:import requests url = "https://vpic.nhtsa.dot.gov/api/vehicles/getallmakes?format=json" response = requests.get(url, timeout=30) # 设置30秒超时阈值调整超时时间后再测试连接情况。
SSL证书验证问题
EMR Serverless环境中可能缺失目标API所需的根CA证书,导致HTTPS握手失败,最终表现为连接超时。可以临时添加verify=False参数跳过证书验证(仅用于测试,生产环境禁止),验证是否能成功请求:response = requests.get(url, verify=False)如果测试成功,说明是证书问题,需要在EMR Serverless环境中配置正确的CA证书。
目标API对EMR Serverless IP段限流/封禁
少数情况下,目标API可能对AWS EMR Serverless的IP段进行了限流或封禁。可以在EMR Serverless作业中使用curl命令直接发起请求,查看返回的具体错误信息;或者尝试访问其他公网API测试是否能正常连接,以此判断是目标API的限制还是EMR Serverless自身的问题。
内容的提问来源于stack exchange,提问作者Ashwini Kumar

