AWS Lambda для шлюза API, SQL и S3 в одном asp.net основной проект

#c# #amazon-web-services #asp.net-core #aws-lambda #amazon-sqs

Вопрос:

Я переношу свое небольшое приложение из Azure в AWS. В Azure я написал несколько функций (прослушиватель HTTP, прослушиватель очереди и прослушиватель больших двоичных объектов) в одном проекте .net.

В AWS я использую «Шаблон бессерверного приложения AWS» (asp.net ядро) из visual studio, я уже разработал все API, которые используются через шлюз API.

Проблема Теперь я хочу реализовать еще 2 лямбда-функции (прослушиватели SQS и S3) в одном проекте, чтобы код и конвейер могли повторно использоваться.

Я добавил класс ниже в свой проект API без сервера.

 public class Function
{
    public async Task FunctionHandler(SQSEvent evnt, ILambdaContext context)
    {
        foreach(var message in evnt.Records)
        {
            await ProcessMessageAsync(message, context);
        }
    }

    private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context)
    {
        context.Logger.LogLine($"Processed message {message.Body}");

        await Task.CompletedTask;
    }
}
 

После добавления триггера из SQS все мои сообщения переместились в сообщения в полете, и я вижу ниже ошибку
Произошла одна или несколько ошибок.

(Ссылка на объект не установлена на экземпляр объекта.): Исключение AggregateException в системе.Нарезание резьбы.Задачи.Задача 1.GetResultCore(Boolean waitCompletionNotification) at lambda_method(Closure , Stream , Stream , LambdaContextInternal ) at Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction.MarshallRequest(InvokeFeatures features, APIGatewayProxyRequest apiGatewayRequest, ILambdaContext lambdaContext) at Amazon.Lambda.AspNetCoreServer.AbstractAspNetCoreFunction 2.Функция Handlerasync(запрос на запрос, ЛЯмбдакОнтекст, лямбдаконтекст)

Класс точки входа

 /// StudentApp::StudentApp.LambdaEntryPoint::FunctionHandlerAsync
/// </summary>
public class LambdaEntryPoint :
    // When using an ELB's Application Load Balancer as the event source change 
    // the base class to Amazon.Lambda.AspNetCoreServer.ApplicationLoadBalancerFunction
    Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
{
    /// <summary>
    /// The builder has configuration, logging and Amazon API Gateway already configured. The startup class
    /// needs to be configured in this method using the UseStartup<>() method.
    /// </summary>
    /// <param name="builder"></param>
    protected override void Init(IWebHostBuilder builder)
    {
        builder
            .UseStartup<Startup>();
    }
}
 

Я новичок в AWS и не уверен, что это правильный способ реализации всех типов лямбда в одном проекте, Для меня не имеет смысла создавать отдельный проект для каждого слушателя (HTTP, SQS и S3).
каково ваше предложение?

Комментарии:

1. Если лямбда-функция вызывается из API geteway, то обработчик функций должен принять аргумент типа APIGatewayProxyRequest . и если вы вызываете функцию из SQS, то функция обработчика должна принять SQSEvent.SQSMessage аргумент. У обработчика вашей функции есть SQSEvent.SQSMessage аргумент, и вы пытаетесь вызвать его через шлюз API.. вот почему вы получаете эту ошибку. Вы не должны использовать вызов шлюза API, если предполагается, что функция вызывается с помощью триггера SQS.