Как использовать демаршализацию событий для определенных 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
мой код автоматически начал получать в этом виде.