簡體   English   中英

對 AWS lambda 函數的 curl 請求沒有收到 json

[英]curl request to AWS lambda function receives no json

我有直接從 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)
}

我創建了一個 .zip 文件、一個角色、附加了該角色並在 lambda 上創建了函數。
我可以成功調用 aws lambda 函數

# 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!"}

我創建了一個函數 URL 並可以通過 awscurl(或 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 不會轉到函數(從日志中驗證),因此不會被我的函數處理

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

我對lambda:InvokeFunctionURL ,但這沒有任何區別

更新:我HandleLambdaRequest函數做了很多改動,見下文


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
}

當您通過函數 URL 調用函數時,Lambda 會以不同方式處理您的請求,這不是很直觀,特別是對於不熟悉 Amazon API Gateway 服務中的 lambda 集成的人來說。 我希望他們在文檔中更清楚地說明這一點。 這是請求和響應有效負載結構 在您的情況下,POST 有效負載映射到event.Body ,您需要像這樣在“MyEvent”結構中定義“body”,

type MyEvent struct {
    ...
    Body string `json:body`
}

希望這可以幫助。

MyEvent與您的 Lambda 實際接收的負載不匹配。 當通過函數 URL 調用時,您的 Lambda 會收到一個具有API 網關請求形狀的事件。

github.com/aws/aws-lambda-go包包含各種 Lambda 調用事件的請求和響應類型。 APIGatewayV2HTTPRequest是您正在尋找的那個。 您的 POST 負載在Body中。

type APIGatewayV2HTTPRequest struct {
    Version               string                         `json:"version"`
    RouteKey              string                         `json:"routeKey"`
    RawPath               string                         `json:"rawPath"`
    RawQueryString        string                         `json:"rawQueryString"`
    Cookies               []string                       `json:"cookies,omitempty"`
    Headers               map[string]string              `json:"headers"`
    QueryStringParameters map[string]string              `json:"queryStringParameters,omitempty"`
    PathParameters        map[string]string              `json:"pathParameters,omitempty"`
    RequestContext        APIGatewayV2HTTPRequestContext `json:"requestContext"`
    StageVariables        map[string]string              `json:"stageVariables,omitempty"`
    Body                  string                         `json:"body,omitempty"`
    IsBase64Encoded       bool                           `json:"isBase64Encoded"`
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM