Por que Serverless não é apenas hype, mas uma salvação para seu bolso e seus nervos
\n\nImagine: você escreveu uma API incrível em C#, colocou-a em uma máquina virtual, e ela fica ociosa 23 horas por dia. Você está pagando pelo ar. Familiar? Se sim, então funções serverless em C# são sua tábua de salvação. A computação serverless (ou Function-as-a-Service) permite que você execute código apenas quando ele é realmente necessário. Sem aluguel de servidores, sem configuração manual de CI/CD para infraestrutura, sem dores de cabeça com escalabilidade.
\n\nNeste artigo, vamos analisar como escrever funções serverless em C# para AWS Lambda e Azure Functions, compará-las, escrever código real e entender por que esta é a melhor escolha para microsserviços, manipuladores de eventos e backend para aplicativos móveis. E sim, terá muito código aqui — sem enrolação.
\n\nAWS Lambda e C#: como unir duas ferramentas poderosas
\n\nAWS Lambda C# é, provavelmente, a opção mais popular para desenvolvedores .NET que trabalham com Amazon Web Services. O Lambda suporta .NET Core 3.1, .NET 6, .NET 8 e até .NET 9 (verifique a atualidade no momento da leitura). A principal vantagem é que você escreve no C# que já conhece, e a AWS cuida do runtime.
\n\nCriando sua primeira função Lambda em C#
\n\nPara começar, instale o AWS Toolkit para Visual Studio ou use o .NET CLI. Vamos criar um projeto com o template "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\nAgora vamos escrever a função em si. Um exemplo clássico — processar uma requisição do API Gateway e retornar 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 = $"Olá, mundo! Sua requisição: {input.Body ?? "vazia"}";\n context.Logger.LogInformation("Função 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\nObserve: o código é assíncrono, usa serialização JSON embutida e logging. Este é um produto mínimo viável que já pode funcionar sob carga.
\n\nPor que AWS Lambda é vantajoso para C#?
\n- \n
- Cold start: A AWS otimizou a inicialização de funções .NET com o SnapStart — agora a inicialização leva menos de 200 ms. \n
- Integração: Funciona nativamente com S3, DynamoDB, SQS, API Gateway. \n
- Monitoramento: CloudWatch coleta logs, métricas e erros. \n
Azure Functions para C#: uma alternativa digna da Microsoft
\n\nSe seu projeto já está vinculado ao ecossistema Microsoft (Azure DevOps, Active Directory, SQL Server), então Azure Functions C# pode ser mais conveniente. Elas suportam tanto o processo isolado (isolated process) quanto o modelo in-process.
\n\nExemplo de função em C# para Azure
\n\nVamos criar um trigger HTTP usando o Azure Functions Core Tools:
\n\nfunc init MyFunctionApp --dotnet-isolated\ncd MyFunctionApp\nfunc new --name HttpExample --template "HTTP trigger"\n\nCódigo da função:
\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