Introducción: Por qué Serverless y C# son la pareja ideal
\nLa arquitectura serverless (o computación sin servidor) es un modelo en el que escribes código sin preocuparte por la gestión de servidores. AWS Lambda es uno de los servicios más populares para ejecutar dicho código. En combinación con C# (.NET), obtienes una herramienta potente, con seguridad de tipos y de alto rendimiento para crear microservicios, manejadores de API y tareas en segundo plano.
\nEn este artículo, recorreremos todo el camino: desde la configuración del entorno hasta el despliegue y monitoreo de tu primera función en C# en AWS Lambda. El material es adecuado tanto para principiantes como para desarrolladores experimentados que deseen sistematizar sus conocimientos.
\n\n1. Preparación del entorno y creación del proyecto
\n1.1 Instalación de herramientas
\nPara trabajar con C# y AWS Lambda necesitarás:
\n- \n
- .NET SDK (8.0 o 6.0) — descárgalo desde dotnet.microsoft.com; \n
- AWS CLI — para gestionar recursos desde la terminal; \n
- Amazon.Lambda.Tools — herramienta global de .NET para el despliegue. \n
Instala Lambda Tools con un solo comando:
\ndotnet tool install -g Amazon.Lambda.Tools\n\n1.2 Creación de la plantilla de función
\nUsa la plantilla integrada para un inicio rápido:
\ndotnet new lambda.EmptyFunction --name MyFirstLambda --profile default --region us-east-1\nEste comando creará un proyecto con el archivo Function.cs y aws-lambda-tools-defaults.json para la configuración del despliegue.
2. Escritura del código de la función Serverless en C#
\n2.1 Estructura básica de una función Lambda
\nCada función Lambda es un método que recibe un objeto de evento y un contexto de ejecución. Veamos un ejemplo sencillo:
\nusing Amazon.Lambda.Core;\nusing Amazon.Lambda.SQSEvents;\n\n[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]\n\npublic class Function\n{\n public async Task<string> FunctionHandler(SQSEvent evnt, ILambdaContext context)\n {\n context.Logger.LogInformation("Mensajes recibidos: " + evnt.Records.Count);\n \n foreach (var record in evnt.Records)\n {\n await ProcessMessageAsync(record.Body, context);\n }\n \n return "Procesados " + evnt.Records.Count + " mensajes";\n }\n\n private async Task ProcessMessageAsync(string messageBody, ILambdaContext context)\n {\n context.Logger.LogInformation("Procesando: " + messageBody);\n await Task.Delay(100); // Simulación de trabajo\n }\n}\nObserva el atributo LambdaSerializer — indica cómo serializar/deserializar JSON. Para C# se recomienda SystemTextJson.
2.2 Trabajo con diferentes disparadores
\nAWS Lambda admite múltiples fuentes de eventos. Aquí tienes un ejemplo para una solicitud HTTP a través de API Gateway:
\npublic async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)\n{\n var name = request.QueryStringParameters?.ContainsKey("name") == true \n ? request.QueryStringParameters["name"] \n : "mundo";\n \n var responseBody = $"¡Hola, {name}!";\n \n return new APIGatewayProxyResponse\n {\n StatusCode = 200,\n Body = responseBody,\n Headers = new Dictionary<string, string> { { "Content-Type", "text/plain" } }\n };\n}\nPara trabajar con HTTP, necesitarás instalar el paquete Amazon.Lambda.APIGatewayEvents.
3. Despliegue y prueba de la función
\n3.1 Prueba local
\nAntes del despliegue, verifica el código localmente con dotnet lambda invoke:
dotnet lambda invoke --payload "{\\"Records\