【问题标题】:client.Timeout exceeded while awaiting headersclient.Timeout 在等待标头时超出
【发布时间】:2020-09-23 10:17:21
【问题描述】:

我有一个用 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 在这里抛出的错误一点也不熟悉。

【问题讨论】:

  • 正如错误所说,请求超时。我们无法从中猜到太多,除了你给它的时间超过 10 秒,可能是因为它仍然无法连接。

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


【解决方案1】:

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

来自docs:

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

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

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

【讨论】:

  • 谢谢,我确实有 NAT 网关,但也许我需要添加一些东西 - 它们都与公共子网相关联。现在我的 ALB 连接了 2 个私有子网和 1 个公共子网(剩下的公共子网,所以我可以在家进行测试)。我的 Lambda 连接了相同的 2 个私有子网。
  • @MrDuk 创建 ALB 时,您选择了面向 Internet 的还是内部的?如果您在家中卷曲,您似乎可以面向互联网。因此它必须在公共子网中。您是否为私有子网配置了路由表以将 Internet 流量路由到公共子网中的 NAT 网关?
猜你喜欢
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 2019-09-20
  • 2019-12-25
  • 1970-01-01
  • 2022-07-28
  • 2021-07-03
  • 2021-09-26
相关资源
最近更新 更多