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

调用AWS Lambda Function URL时JSON数据无法正常接收处理

问题:AWS Lambda Function URL无法传递JSON数据到Go函数

初始实现代码

我直接使用Lambda官方教程中的Go语言代码:

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"

    "github.com/aws/aws-lambda-go/lambda"
)

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

type MyResponse struct {
    Message string `json:"Answer"`
}

func HandleLambdaEvent(ctx context.Context, event MyEvent) (MyResponse, error) {
    // event
    eventJson, _ := json.MarshalIndent(event, "", "  ")
    log.Printf("EVENT: %s", eventJson)

    return MyResponse{Message: fmt.Sprintf("%s is %d years old!", event.Name, event.Age)}, nil
}

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

CLI调用正常

我已经完成了zip包打包、IAM角色创建关联,成功部署Lambda函数。通过AWS CLI调用完全正常:

# aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"name": "Kevin", "age":62}' output.txt

# cat output.txt
{"Answer":"Kevin is 62 years old!"}

Function URL调用异常

我创建了Function URL,尝试用curl调用:

# curl -X POST https://XXXXXXXXXX.lambda-url.us-east-1.on.aws/  \
    -H 'Content-type: application/json' \
    --user AWS_ID:AWS_KEY \
    --aws-sigv4 "aws:amz:us-east-1:lambda" \
    -d '{"Name": "Kevin", "Age": 62}' 

但JSON数据无法传递到函数中(已通过Lambda日志验证),函数返回结果如下:

{"Answer":" is 0 years old!"}

我尝试调整lambda:InvokeFunctionURL权限,但没有任何效果。

尝试修改后的函数代码

我大幅修改了HandleLambdaEvent函数,尝试兼容不同的事件格式,但问题仍未解决:

func HandleLambdaEvent(ctx context.Context, request map[string]interface{}) (MyResponse, error) {
    // event
    jsonStr, err := json.Marshal(request)
    if err != nil {
        return MyResponse{Message: "can't unmarshal request"}, nil
    }
    var event Event
    if err = json.Unmarshal(jsonStr, &event); err != nil {
        return MyResponse{Message: err.Error()}, nil
    }
    if event.Name == "" {
        var apigate events.APIGatewayV2HTTPRequest
        if err = json.Unmarshal(jsonStr, &apigate); err != nil {
            return MyResponse{Message: "can't get event or request"}, nil
        }
        body := []byte(apigate.Body)
        if err = json.Unmarshal(body, &event); err != nil {
            return MyResponse{Message: "can't unmarshal api.Body"}, nil
        }
        return MyResponse{Message: fmt.Sprintf("url %s:%d", event.Name, event.Age)}, nil
    }

    return MyResponse{Message: fmt.Sprintf("invoke %s:%d", event.Name, event.Age)}, nil
}

内容的提问来源于stack exchange,提问作者KevinDTimm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:40:46