为了账号安全,请及时绑定邮箱和手机立即绑定

client.Timeout 在等待标头时超出

client.Timeout 在等待标头时超出

Go
qq_花开花谢_0 2022-06-06 17:55:04
我有一个用 Go 编写的 lambda,它与 AWS 中的应用程序负载均衡器后面的轻量级 http 应用程序通信:package mainimport (    "io/ioutil"    "log"    "net/http"    "os"    "time")func main() {    for {        req, err := http.NewRequest("GET", "http://my-app-12345.us-east-1.elb.amazonaws.com:8080", nil)        if err != nil {            log.Fatal("Error reading request. ", err)        }        req.Header.Set("Load-Rate", os.Getenv("LOAD"))        client := &http.Client{Timeout: time.Second * 10}        resp, err := client.Do(req)        if err != nil {            log.Fatal("Error reading response. ", err)        }        if resp.StatusCode == http.StatusOK {            bodyBytes, err := ioutil.ReadAll(resp.Body)            if err != nil {                log.Fatal(err)            }            bodyString := string(bodyBytes)            log.Println(bodyString)        }        time.Sleep(time.Duration(10) * time.Millisecond)    }}我已经在 lambda 和 ALB 使用的安全组中的所有端口上开放了全球访问权限,并且我可以从我的家用机器上很好地卷曲端点。但是,当我尝试在 Lambda 中运行它时,我在 CloudWatch 日志中得到以下信息:2020-06-04T07:06:31.028-05:00 进程在完成请求之前退出2020-06-04T07:06:41.100-05:00 2020/06/04 12:06:41 读取响应时出错。获取 http://my-app-12345.us-east-1.elb.amazonaws.com:8080:net/http:在等待连接时取消请求(等待标头时超出 Client.Timeout)2020-06-04T07: 06:41.101-05:00 2020/06/04 12:06:41 退出状态 1我很难确定这是 Go 问题还是我在 AWS 中的某些配置有误。我对 Go 在这里抛出的错误一点也不熟悉。
查看完整描述

1 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

你的 lambda 似乎在 VPC 中,因为你写了它的安全组。如果是这种情况,那么超时的最可能原因是VPC 中的 lambda 没有互联网访问权限,也没有公共 IP,即使它在公共子网中也是如此。

来自文档

将函数连接到公共子网不会为其提供 Internet 访问权限或公共 IP 地址。

由于您的 ALB 是公共的(您从家里卷曲它),因此您的 lambda 无法访问它,即使它们都在同一个子网中。

要纠正此问题,您必须使用正确的路由设置NAT 网关或实例,以便能够从 VPC 中的 lambda 通信到您的公共 ALB,并将您的 lambda 放置在私有子网中。


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信