在Github Runner中使用Terratest调用HttpGet方法出现连接被拒绝报错
问题原因及解决方法
核心触发原因
按优先级从高到低排列:
- AWS ALB安全组访问限制:你本地的公网IP提前配置在了ALB安全组的80端口入站允许列表中,但Github托管Runner的公网IP是动态分配的,默认不在ALB的入站允许规则内,ALB会直接拒绝来自Runner IP的访问请求,返回连接被拒绝报错。Runner能通过80端口拉取依赖是因为请求走的是官方预设的代理/允许的域名规则,不属于直接访问自定义ALB的场景。
- ALB未完全就绪就发起请求:Terratest执行Http请求时,ALB刚部署完成,还未完成健康检查、后端实例挂载或节点预热,此时访问80端口会被拒绝。本地测试通常和资源部署有时间差,ALB已经完成就绪,所以访问正常。
- Runner代理配置冲突:如果你的Runner配置了HTTP/HTTPS代理,拉取依赖的域名在代理允许列表中,但ALB域名未被加入允许列表,或未配置在NO_PROXY规则中,会导致请求被代理拦截,返回连接拒绝。
- DNS解析差异:刚创建的ALB DNS记录存在区域同步延迟,Runner侧解析到的是未就绪的ALB节点IP,而本地已经解析到可用IP,导致两端访问结果不一致。
排查&修复方案
- 先在CI的Terratest执行步骤前增加调试命令,确认Runner侧的访问状态:
# 打印Runner侧的ALB域名解析结果 nslookup xxxx-EPAJpE-12249xxxxx.us-west-1.elb.amazonaws.com # 打印Runner侧的代理配置 echo $HTTP_PROXY $HTTPS_PROXY $NO_PROXY # 直接用curl测试访问,输出详细日志 curl -v http://xxxx-EPAJpE-12249xxxxx.us-west-1.elb.amazonaws.com
- 替换原生
http.Get为Terratest自带的带重试的Http请求方法,避开ALB未就绪的时间窗口:
// 示例:最多重试15次,每次间隔10秒,预期返回200状态码 resp, err := http_helper.HttpGetWithRetry(t, url, nil, 200, 15, 10*time.Second)
- 临时放开ALB安全组的80端口入站规则到
0.0.0.0/0测试,如果放开后请求正常,就确认是安全组限制问题。后续可以用两种方案处理:- 测试前先调用AWS API获取当前Runner的公网IP,动态添加到ALB安全组的允许列表,测试完成后自动删除规则
- 把Github官方公布的托管Runner所属的Azure IP段配置到ALB安全组中
- 如果是代理导致的问题,把你的ALB域名添加到CI的
NO_PROXY环境变量中即可。
内容的提问来源于stack exchange,提问作者Yahowmy
相关产品推荐
相关产品推荐

