Serverless en C#: AWS Lambda, Azure Functions y el futuro del desarrollo sin servidor

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué Serverless no es solo una moda, sino un salvavidas para tu bolsillo y tus nervios

\n\n

Imagina: 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\n

En 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\n

AWS Lambda y C#: cómo hacer amigos a dos herramientas poderosas

\n\n

AWS 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\n

Creando nuestra primera función Lambda en C#

\n\n

Para empezar, instala AWS Toolkit para Visual Studio o usa .NET CLI. Crearemos un proyecto con la plantilla «AWS Lambda Project».

\n\n
dotnet new lambda.EmptyFunction --name HelloWorldFunction\ncd HelloWorldFunction\ndotnet add package Amazon.Lambda.Core\ndotnet add package Amazon.Lambda.Serialization.SystemTextJson
\n\n

Ahora escribimos la función. Un ejemplo clásico: procesar una solicitud de API Gateway y devolver JSON.

\n\n
using 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\n

Observa: 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
\n\n

Azure Functions para C#: una alternativa digna de Microsoft

\n\n

Si 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\n

Ejemplo de función en C# para Azure

\n\n

Crearemos un disparador HTTP con Azure Functions Core Tools:

\n\n
func init MyFunctionApp --dotnet-isolated\ncd MyFunctionApp\nfunc new --name HttpExample --template "HTTP trigger"
\n\n

Código de la función:

\n\n
using 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                

Blogs

Book Recommendations