如何将解组事件用于 go1.x 的 lambda 容器映像中 AWS 定义的类型,并提供为基础

Posted

技术标签:

【中文标题】如何将解组事件用于 go1.x 的 lambda 容器映像中 AWS 定义的类型,并提供为基础【英文标题】:How to use unmarshal events to AWS defined types in lambda container image for go1.x with provided as base 【发布时间】:2022-01-07 05:04:42 【问题描述】:

我使用 API Gatway 通过代理集成触发 Lambda

我从 public.ecr.aws/lambda/provided:al2 为 Golang 构建了一个 lambda 容器映像,因为依赖项无法安装在 public.ecr.aws/lambda/go:latest 中。

我的Docerfile 内容的PFB

FROM public.ecr.aws/lambda/provided:al2
COPY ./config/yumrepo/dep1.repo /etc/yum.repos.d/dep1.repo
COPY ./config/yumrepo/dep2.repo /etc/yum.repos.d/dep2.repo

RUN yum install -y dep1 dep2

COPY --from=build /main /var/runtime/bootstrap # If I dont copy to bootstrap the lambda is not starting up

CMD [ "handler" ]

我面临的问题是事件处于编组状态。如果我对 lambda 进行 api 调用,则预期的函数将其作为 events.APIGatewayProxyRequest 抛出错误,因为输入的类型为 map[string]interface

我的猜测是,这与运行时接口客户端和引导程序有关。我从AWS Lambda guide 获得了以下参考资料

AWS 没有为 Go 提供单独的运行时接口客户端。 aws-lambda-go/lambda 包包含运行时接口的实现。

上面的图像得到构建,并使用以下代码使 API 工作。

func (h *Handler) HandleRequest(ctx context.Context, request interface) (interface, error) 
    requestMap := request.(map[string]interface)
    _, ok := getMapValue(requestMap, "headers")
    if ok 
        httpMethod, _ := getStringValue(requestMap, "httpMethod")
        resource, _ := getStringValue(requestMap, "resource")
        body, _ := getStringValue(requestMap, "body")
        requestObj := events.APIGatewayProxyRequest
            Body:            body,
            IsBase64Encoded: false,
            Resource:        resource,
            HTTPMethod:      httpMethod,
        
        return h.HandleAPIRequest(ctx, requestObj)
    
    return nil, fmt.Errorf("unknown request type")

这是构建图像的正确方法以及如何在我的代码中以 AWS 定义的类型接收事件吗?

【问题讨论】:

【参考方案1】:

发现问题

由于处理函数需要interface,所以在我将request 参数的类型更改为events.APIGatewayProxyRequest 后,request 将作为map[string]interface 传递,我的代码自动开始接收此类型。

【讨论】:

以上是关于如何将解组事件用于 go1.x 的 lambda 容器映像中 AWS 定义的类型,并提供为基础的主要内容,如果未能解决你的问题,请参考以下文章

用于 lambda 的弱事件处理程序模型

如何使 AWS ALB 将请求源发送到 lambda

cad怎么解组,cad如何解组?

如何调试 JAXB 解组?

如何解组 JSON?

如何使用 Ruby 将解压缩的数组转换为单个值?