лямбда-функция aws с использованием бессерверного шаблона ядра asp.net

У меня недостаточно знаний об AWS, но моя компания попросила меня выполнить работу, которую, я думаю, AWS Lambda делает отлично. Требование состоит в том, что я должен создать службу с конечной точкой, которую нужно вызывать дважды в день. Подход, которому я следовал, заключается в том, что я создал бессерверный веб-API через Visual Studio и создал конечную точку шлюза API для каждой конечной точки. Затем добавил триггер через события облачных часов, чтобы запускать его дважды в день, но всякий раз, когда функция запускается, я получаю эту ошибку.

Object reference not set to an instance of an object.: NullReferenceException
   at Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction.MarshallRequest(InvokeFeatures features, APIGatewayProxyRequest apiGatewayRequest, ILambdaContext lambdaContext)
   at Amazon.Lambda.AspNetCoreServer.AbstractAspNetCoreFunction`2.FunctionHandlerAsync(TREQUEST request, ILambdaContext lambdaContext)
   at lambda_method(Closure , Stream , Stream , LambdaContextInternal )

person k.jabs    schedule 15.03.2021    source источник
comment
Если вы вызываете функцию Lambda, написанную на .NET, с помощью события cloudwatch, зачем использовать API Gateway? Вы можете вызвать функцию Lambda прямо из события cloudwatch.   -  person smac2020    schedule 15.03.2021


Ответы (1)


У меня такая же проблема, и я недавно мог ее исправить.

Если вы используете Lambda с ASP.NET Core, у вас должен быть класс LambdaEntryPoint для обработки всех запросов. Попробуйте переопределить метод MarshallRequest в этом классе, добавить ведение журнала и посмотреть, что у вас есть в параметре apiGatewayRequest. Код может выглядеть примерно так:

protected override void MarshallRequest(InvokeFeatures features, APIGatewayProxyRequest apiGatewayRequest, ILambdaContext lambdaContext)
{
    LambdaLogger.Log($"Request path: {apiGatewayRequest.Path}");
    LambdaLogger.Log($"Request path parameters: {apiGatewayRequest.PathParameters}");
    LambdaLogger.Log($"Request body: {apiGatewayRequest.Body}");
    LambdaLogger.Log($"Request request context: {apiGatewayRequest.RequestContext}");
    base.MarshallRequest(features, apiGatewayRequest, lambdaContext);
}

В моем случае все эти значения были нулевыми. Причина заключалась в использовании Amazon EventBridge для поддержания Lambda в сети, чтобы избежать холодного старта. Если вы также используете EventBridge, попробуйте правильно настроить запрос там. Если нет, вы можете попробовать обновить MarshalRequest следующим образом:

protected override void MarshallRequest(InvokeFeatures features, APIGatewayProxyRequest apiGatewayRequest, ILambdaContext lambdaContext)
{
    if(apiGatewayRequest.RequestContext == null) //Or other property
    {
        return;
    }

    base.MarshallRequest(features, apiGatewayRequest, lambdaContext);
}
person Grigory Zhadko    schedule 07.04.2021