Por qué Serverless no es solo una moda, sino un salvavidas para tu bolsillo y tus nervios
\n\nImagina: escribiste una API genial en C#, la ejecutaste en una máquina virtual, y está inactiva 23 horas al día. Pagas por aire. ¿Te suena familiar? Si es así, entonces las funciones serverless en C# son tu salvavidas. La computación sin servidor (o Function-as-a-Service) te permite ejecutar código solo cuando realmente se necesita. Sin alquiler de servidores, sin configuración manual de CI/CD para la infraestructura, sin dolores de cabeza con el escalado.
\n\nEn este artículo analizaremos cómo escribir funciones serverless en C# para AWS Lambda y Azure Functions, las compararemos, escribiremos código real y entenderemos por qué esta es la mejor opción para microservicios, manejadores de eventos y backend para aplicaciones móviles. Y sí, habrá mucho código — sin rodeos.
\n\nAWS Lambda y C#: cómo hacer amigos a dos herramientas poderosas
\n\nAWS Lambda C# es, probablemente, la opción más popular para desarrolladores .NET que trabajan con Amazon Web Services. Lambda soporta .NET Core 3.1, .NET 6, .NET 8 e incluso .NET 9 (verifica la vigencia al momento de leer). La principal ventaja es que escribes en el C# que conoces, y AWS se encarga del runtime.
\n\nCreando nuestra primera función Lambda en C#
\n\nPara empezar, instala AWS Toolkit para Visual Studio o usa .NET CLI. Crearemos un proyecto con la plantilla «AWS Lambda Project».
\n\ndotnet new lambda.EmptyFunction --name HelloWorldFunction\ncd HelloWorldFunction\ndotnet add package Amazon.Lambda.Core\ndotnet add package Amazon.Lambda.Serialization.SystemTextJson\n\nAhora escribimos la función. Un ejemplo clásico: procesar una solicitud de API Gateway y devolver JSON.
\n\nusing Amazon.Lambda.Core;\nusing Amazon.Lambda.Serialization.SystemTextJson;\n\n[assembly: LambdaSerializer(typeof(DefaultLambdaJsonSerializer))]\n\npublic class Function\n{\n public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest input, ILambdaContext context)\n {\n var message = $"¡Hola, mundo! Tu solicitud: {input.Body ?? "vacío"}";\n context.Logger.LogInformation("Función Lambda invocada");\n\n return new APIGatewayProxyResponse\n {\n StatusCode = 200,\n Body = JsonSerializer.Serialize(new { message, timestamp = DateTime.UtcNow }),\n Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }\n };\n }\n}\n\nObserva: el código es asíncrono, usa serialización JSON integrada y registro de logs. Este es un producto mínimamente viable que ya puede funcionar bajo carga.
\n\n¿Por qué AWS Lambda gana para C#?
\n- \n
- Cold start: AWS optimizó el inicio de funciones .NET con SnapStart — ahora el arranque toma menos de 200 ms. \n
- Integración: Funciona de serie con S3, DynamoDB, SQS, API Gateway. \n
- Monitoreo: CloudWatch recopila logs, métricas, errores. \n
Azure Functions para C#: una alternativa digna de Microsoft
\n\nSi tu proyecto ya está vinculado al ecosistema de Microsoft (Azure DevOps, Active Directory, SQL Server), entonces Azure Functions C# podría resultar más conveniente. Soportan tanto el proceso aislado (isolated process) como el modelo intraproceso.
\n\nEjemplo de función en C# para Azure
\n\nCrearemos un disparador HTTP con Azure Functions Core Tools:
\n\nfunc init MyFunctionApp --dotnet-isolated\ncd MyFunctionApp\nfunc new --name HttpExample --template "HTTP trigger"\n\nCódigo de la función:
\n\nusing Microsoft.Azure.Functions.Worker;\nusing Microsoft.Extensions.Logging;\n\npublic class HttpExample\n{\n private readonly ILogger<HttpExample> _logger;\n\n public HttpExample(ILogger<HttpExample> logger)\n {\n _logger