将 golang 服务器应用程序移植到 aws lambda + api 网关

我正在尝试将运行小型 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、apex/gateway的这个插入式替换存储库,但我认为我错过了让它工作的基本步骤。


我所做的是下载和导入库


import (

    ...

    

    "github.com/apex/gateway/v2"

)

然后只需替换 main、zip 中的函数并上传到 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 函数。


它不起作用。我想我错过了一些东西,但我不知道是什么。从apex/gateway repo 上的示例中,我看不出我缺少什么。


该应用程序是Tinygraphs fwiw。


谢谢


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


{"message":"Not Found"}


POPMUISE
浏览 206回答 2
2回答

慕的地10843

嘿用户我相信你不了解 API Gateway 和 Lambda 是如何正常工作的您不需要在 8080 上设置路由监听,这实际上是 API Gateway 正在执行的操作,然后将请求转发到在 lambda 上运行的代码。通常采用这种格式:package mainimport (        "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)}

白衣染霜花

是一个非常愚蠢的错误。我将 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忽略)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go