【问题标题】:Parsing (Unmarshaling) AWS lambda request body triggered by ALB with gRPC使用 gRPC 解析(解组)由 ALB 触发的 AWS lambda 请求正文
【发布时间】:2021-10-24 18:24:19
【问题描述】:

我正在尝试在我的 lambda 函数中解析来自 events.ALBTargetGroupRequest 的请求正文。

我找不到任何关于我应该如何解析这个二进制数据的示例或解释。我的想法是我会得到一个原型,然后解组它,但事实并非如此。 流程是gRPC-->ALB-->Lambda

Lambda 代码示例:

func HandleRequest(ctx context.Context, request events.ALBTargetGroupRequest) (events.ALBTargetGroupResponse, error) {
    // Assume body is base64 encoded
    bt, err := base64.StdEncoding.DecodeString(request.Body)
    if err != nil {
        log.Printf("Failed to decode body: %s\n", err.Error())
        return events.ALBTargetGroupResponse{}, err
    }

    msg := pb.Msg{}
    err = proto.Unmarshal(bt, &msg)
    if err != nil {
        log.Printf("Failed to unmarshal body: %s\n", err.Error())
        return events.ALBTargetGroupResponse{}, err
    }

    return events.ALBTargetGroupResponse{Body: "", StatusCode: 200, StatusDescription: "200 OK", IsBase64Encoded: false, Headers: map[string]string{}}, nil
}

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

标题:

{
    "accept-encoding": "identity,gzip",
    "content-type": "application/grpc",
    "grpc-accept-encoding": "identity,deflate,gzip",
    "grpc-timeout": "353S",
    "te": "trailers",
    "user-agent": "grpc-c++/1.16.0 grpc-c/6.0.0 (linux; chttp2; gao)",
    "x-amzn-trace-id": "Root=1-6124edf6-4fa33c5674127c7266ba0430"
}

错误:

Failed to Unmarshal body:  proto: cannot parse invalid wire-format data
proto: cannot parse invalid wire-format data: prefixError

字节数组:(如果有帮助的话)

[0 0 0 0 85 10 83 10 43 105 112 45 49 48 45 49 54 53 45 50 50 53 45 55 53 46 101 117 45 119 101 115 116 45 50 46 99 111 109 112 117 116 101 46 105 110 116 101 114 110 97 108 18 36 102 56 56 56 101 100 53 99 45 54 102 99 51 45 52 99 54 99 45 56 49 99 55 45 55 53 101 100 48 99 57 50 54 102 50 53]

如果有人能对这个主题有所了解,我将不胜感激。

【问题讨论】:

  • 你能贴出整个字节数组吗?
  • @blackgreen 已编辑

标签: go aws-lambda grpc aws-load-balancer aws-application-load-balancer


【解决方案1】:

events.ALBTargetGroupRequest 似乎是一个常规的 Golang 结构(已经为你解组了)。

见:https://github.com/aws/aws-lambda-go/blob/master/events/README_ALBTargetGroupEvents.md

您不需要 (un)marshal request 并且可以像使用它的响应兄弟 event.ALBTargetGroupResponsebody 一样使用它。

【讨论】:

  • 解码请求正文后,我无法真正从中提取数据,我得到的只是一个包含未知字符的字符串。
  • 这看起来都被记录了,请参阅:docs.aws.amazon.com/elasticloadbalancing/latest/application/… 如果req.sBase64Encodedfalse 那么body 只是一个字符串(无需解码)。如果true,那么它是base 64 编码的。
  • Body 是 base 64 编码的,可能我忘了说。
猜你喜欢
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
相关资源
最近更新 更多