将基于 golang/docker 的 http api 部署到 aws lambda 时,您可能会遇到 apigatewayproxyrequest 中的路径属性为空的问题。发生这种情况是因为 lambda 函数正在从 api gateway http api (v2) 接收事件,与 rest api (v1) 相比,它使用不同的事件结构。
问题
apigatewayproxyrequest 是为较旧的 rest api 设计的,与 http api 一起使用时将导致空路径字段。解决方案是使用正确的事件结构:apigatewayv2httprequest.
解决方案
切换到使用 apigatewayv2httprequest 结构,其中包含 rawpath 字段以正确处理路由。
他们文档中的原始代码(不起作用):
package main
import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
)
func handler(ctx context.context, event events.apigatewayproxyrequest) (events.apigatewayproxyresponse, error) {
response := events.apigatewayproxyresponse{
statuscode: 200,
body: "\"hello from lambda!\"",
}
return response, nil
}
func main() {
lambda.start(handler)
}
这是更新的 lambda 函数示例:
package main
import (
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
)
func handler(request events.APIGatewayV2HTTPRequest) (*events.APIGatewayV2HTTPResponse, error) {
if request.RawPath == "/health" {
return &events.APIGatewayV2HTTPResponse{
StatusCode: 200,
Body: "Health check passed",
}, nil
}
return &events.APIGatewayV2HTTPResponse{
StatusCode: 404,
Body: "Not Found",
}, nil
}
func main() {
lambda.Start(handler)
}
部署您的 lambda
- 将 lambda 函数部署到 aws。
- 在 api gateway 中创建 http api 并将其与您的 lambda 函数集成。
- 测试端点:向 /health 发送请求应该返回成功消息,而任何其他路径都会返回 404。
结论
切换到 apigatewayv2httprequest 可解决使用 api gateway http api (v2) 时 lambda 函数中的空路径问题。请务必测试您的端点以确保路径路由按预期工作。
源自 github 问题:
https://github.com/aws/aws-lambda-go/issues/60










