You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lambda函数经API Gateway触发后Path字段为空的问题排查

问题

我写了一个用于测试的Lambda函数,想根据请求路径(比如/abc)执行不同逻辑,代码如下:

package main

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

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

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

func handler(ctx context.Context, event events.APIGatewayProxyRequest) (*string, error) {

    fmt.Println(event.Path, " --- ", event.Body)
    fmt.Printf(
        "Path: %#v PathParams: %#v QSParams: %#v ReqContext: %#v",
        event.Path,
        event.PathParameters,
        event.QueryStringParameters,
        event.RequestContext,
    )

    //if event == nil {
    //  fmt.Println("Empty event")
    //  return nil, fmt.Errorf("received nil event")
    //}

    message := fmt.Sprintf("Hello %v!", "event.Name")
    fmt.Println("Message is:", message)
    return &message, nil
}

这个函数通过API Gateway注册的/test路由触发,完整URL是https://someid.execute-api.regionname.amazonaws.com/default/test。

现在遇到的问题是获取到的Path为空字符串,日志输出如下:

Path: "" // <------- path is missing
PathParams: map[string]string(nil) 
QSParams: map[string]string(nil) 
ReqContext: events.APIGatewayProxyRequestContext{
    AccountID:"xxxxxxxxxxx", 
    ResourceID:"", 
    OperationName:"", 
    Stage:"default", 
    DomainName:"xxxxxxxxxx.execute-api.xxxxxxx.amazonaws.com", 
    DomainPrefix:"xxxxxxxxxx", 
    RequestID:"xxxxxxxxx", 
    ExtendedRequestID:"", 
    Protocol:"", 
    Identity:events.APIGatewayRequestIdentity{
        CognitoIdentityPoolID:"", 
        AccountID:"", 
        CognitoIdentityID:"", 
        Caller:"", 
        APIKey:"", 
        APIKeyID:"", 
        AccessKey:"", 
        SourceIP:"", 
        CognitoAuthenticationType:"", 
        CognitoAuthenticationProvider:"", 
        UserArn:"", 
        UserAgent:"", 
        User:""
    }, 
    ResourcePath:"", 
    Path:"", 
    Authorizer:map[string]interface {}(nil), 
    HTTPMethod:"", 
    RequestTime:"", 
    RequestTimeEpoch:0, 
    APIID:"xxxxxxx"
}

除了Path为空,函数其他功能正常,请问问题出在哪里?

分析与解决

1. API Gateway集成类型错误(最核心原因)

你当前用的是普通Lambda集成,而非Lambda代理集成。只有代理集成会自动把完整的请求元数据(包括Path、HTTP方法、路径参数、查询参数等)封装成APIGatewayProxyRequest结构传递给Lambda。普通集成只会传递你自定义的请求体,不会包含路径等上下文信息。

解决操作:

  • 登录AWS控制台,进入对应API的API Gateway管理页面
  • 找到/test路由的"集成请求"设置
  • 将集成类型从"Lambda函数"切换为"Lambda代理集成"
  • 重新部署API到目标阶段(比如你的default阶段)

2. 测试事件格式不正确

如果是在Lambda控制台直接测试函数,默认的测试事件可能不是标准的APIGatewayProxyRequest格式,或者里面的Path字段未填充。测试时要使用符合规范的代理请求事件:

{
  "resource": "/test",
  "path": "/test",
  "httpMethod": "GET",
  "requestContext": {
    "resourcePath": "/test",
    "path": "/test"
  }
}

3. 未重新部署API

修改集成配置后,必须重新部署API到对应阶段,否则旧配置会继续生效。在API Gateway控制台点击"部署API",选择你的default阶段完成部署即可。

额外代码优化提示

你的代码里有个小问题:message := fmt.Sprintf("Hello %v!", "event.Name")中的"event.Name"是字符串字面量,不会读取结构体的Name字段值,应该改成event.Name(去掉引号),这样才能正确输出传入的名称。

内容的提问来源于stack exchange,提问作者Md. A. A. Apu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:05:55