调用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
相关产品推荐
相关产品推荐

