client.Timeout在等待头时超出

时间:2020-06-04 12:21:58

标签: amazon-web-services go aws-lambda

我有一个用Go语言编写的lambda,可与AWS中应用程序负载均衡器后面的轻量级http应用程序通信:

package main

import (
    "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 个答案:

答案 0 :(得分:1)

您lambda似乎在VPC中,因为您撰写了有关其安全组的信息。如果是这种情况,那么超时的最可能原因是,即使在公共子网中,VPC中的 lambda也无法访问互联网,也没有公共IP

来自docs

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

由于您的ALB是公开的(您可以在家中卷曲它),因此即使它们都在同一子网中,您的Lambda也无法访问它。

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