【问题标题】:Porting a golang server app to aws lambda + api gateway将 golang 服务器应用程序移植到 aws lambda + api 网关
【发布时间】:2021-02-09 18:29:57
【问题描述】:

我正在尝试将运行小型 golang 应用程序的服务器移植到 AWS Lambda。我对 golang 不是很熟悉,要部署到我刚刚按照 repo 中的说明进行部署的服务器。

它运行一个带有net/http的服务器,main.go如下:

func main() {
    r := new(route.Router)
    r.HandleFunc("/squares", squares.Random)

    // ... more Handlers

    log.Println("Listening on " + os.Getenv("PORT"))
    err := http.ListenAndServe(":"+os.Getenv("PORT"), r)
    if err != nil {
        log.Fatal("ListenAndServe:", err)
    }
}

现在我在 Github 上为 ListenAndServe 找到了这个插入式替换 repo,apex/gateway,但我认为我错过了让它发挥作用的基本步骤。

我所做的是下载和导入库

import (
    ...
    
    "github.com/apex/gateway/v2"
)

然后简单地替换 main 中的函数,压缩并上传到 aws lambda

func main() {
    r := new(route.Router)
    r.HandleFunc("/squares", squares.Random)

    // ... more Handlers

    // log.Println("Listening on 8080")
    err := gateway.ListenAndServe(":8080", r)
    if err != nil {
        log.Fatal("ListenAndServe:", err)
    }
}

然后我设置了一个 http API 网关并链接到 lambda 函数。

它不起作用。我想我错过了一些东西,但我不知道是什么。从example on the apex/gateway repo,我看不出我缺少什么。

应用程序是Tinygraphs fwiw。

谢谢

编辑: 根据 Adrians 的评论,当我转到 api 链接时,我得到了

{"message":"Not Found"}

【问题讨论】:

  • 发布时,提供更多关于问题的详细信息而不是“它不起作用”会很有帮助。具体是什么问题?你有错误吗?如果是这样,错误是什么?如果不是,你是如何确定它不起作用的?究竟发生了什么?
  • “内部服务器错误”表示您需要查看后端日志。 AWS Lambda 日志或 API Gateway 日志以查看实际错误是什么。如果没有这些信息,任何人都只能猜测问题所在。
  • 正确的错误是 {"message":"Not Found"},对不起

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


【解决方案1】:

嗨,用户,我相信您不了解 API Gateway 和 Lambda 是如何正常工作的

您无需在 8080 上设置路由,这实际上是 API Gateway 正在执行的操作,然后将请求转发到在 lambda 上运行的代码。通常是这种格式:

package main

import (
        "fmt"
        "context"
        "github.com/aws/aws-lambda-go/lambda"
)

type MyEvent struct {
        Name string `json:"name"`
}

func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
        return fmt.Sprintf("Hello %s!", name.Name ), nil
}

func main() {
        lambda.Start(HandleRequest)
}

【讨论】:

  • 谢谢大卫,我确实在某处读过,但我认为它是在 apex/gateway 存储库中处理的。此外,在 apex/gateway repo 的示例中,它们确实指定了一个端口。您认为在 aws 上部署的 apex/gateway 示例中缺少什么,或者您将如何扩展您的示例以运行我的应用程序?
【解决方案2】:

这是一个非常愚蠢的错误。

我将 api 路径定义为 / 而不是 /{proxy+},因此它不接受非 root url,而调用 url 是这样的: https://XXXXXXXX.execute-api.us-east-1.amazonaws.com/squares/tinygraphs?theme=frogideas&numcolors=4&size=220&fmt=svg

感谢所有看到这里的人。

(关于端口,根据this,指定的端口只是被gateway.ListenAndServe忽略)

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多