#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.