Как использовать демаршализацию событий для определенных AWS типов в образе лямбда-контейнера для go1.x с предоставленным в качестве основы

Я использую API Gatway для запуска Lambda с интеграцией прокси

Я создаю образ контейнера лямбда для Golang из public.ecr.aws/lambda/provided:al2 из-за зависимости, которую нельзя установить в public.ecr.aws/lambda/go:latest.

ПФБ для моего Docerfile содержание

      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" ]

Проблема, с которой я столкнулся, заключается в том, что события находятся в упорядоченном состоянии. Если я сделаю вызов api для лямбды, предполагаемая функция, которая ожидает ее как events.APIGatewayProxyRequest выдает ошибку, поскольку вход имеет тип map[string]interface{}.

Я предполагаю, что это как-то связано с клиентами интерфейса времени выполнения и начальной загрузкой. Я получил следующую ссылку из руководства AWS Lambda для того же

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передается как map[string]interface{}после того, как я изменил тип requestпараметр для events.APIGatewayProxyRequestмой код автоматически начал получать в этом виде.

Другие вопросы по тегам