Introdução: Por que Serverless e C# são a combinação ideal
\nA arquitetura Serverless (ou computação sem servidor) é um modelo no qual você escreve código sem se preocupar com o gerenciamento de servidores. AWS Lambda é um dos serviços mais populares para executar esse tipo de código. Em conjunto com C# (.NET), você obtém uma ferramenta poderosa, type-safe e de alto desempenho para criar microsserviços, manipuladores de API e tarefas em segundo plano.
\nNeste artigo, abordaremos todo o percurso: desde a configuração do ambiente até o deploy e monitoramento da sua primeira função em C# no AWS Lambda. O material é adequado tanto para iniciantes quanto para desenvolvedores experientes que desejam sistematizar seus conhecimentos.
\n\n1. Preparação do ambiente e criação do projeto
\n1.1 Instalação das ferramentas
\nPara trabalhar com C# e AWS Lambda, você precisará de:
\n- \n
- .NET SDK (8.0 ou 6.0) — baixar em dotnet.microsoft.com; \n
- AWS CLI — para gerenciar recursos pelo terminal; \n
- Amazon.Lambda.Tools — ferramenta global .NET para deploy. \n
Instale o Lambda Tools com um único comando:
\ndotnet tool install -g Amazon.Lambda.Tools\n\n1.2 Criação do template da função
\nUse o template embutido para um início rápido:
\ndotnet new lambda.EmptyFunction --name MyFirstLambda --profile default --region us-east-1\nEste comando criará um projeto com o arquivo Function.cs e aws-lambda-tools-defaults.json para configurações de deploy.
2. Escrita do código da função Serverless em C#
\n2.1 Estrutura básica de uma função Lambda
\nCada função Lambda é um método que recebe um objeto de evento e um contexto de execução. Vejamos um exemplo simples:
\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("Mensagens recebidas: " + evnt.Records.Count);\n \n foreach (var record in evnt.Records)\n {\n await ProcessMessageAsync(record.Body, context);\n }\n \n return "Processadas " + evnt.Records.Count + " mensagens";\n }\n\n private async Task ProcessMessageAsync(string messageBody, ILambdaContext context)\n {\n context.Logger.LogInformation("Processando: " + messageBody);\n await Task.Delay(100); // Simulação de trabalho\n }\n}\nObserve o atributo LambdaSerializer — ele indica como serializar/desserializar JSON. Para C#, recomenda-se SystemTextJson.
2.2 Trabalhando com diferentes triggers
\nAWS Lambda suporta várias fontes de eventos. Aqui está um exemplo para requisição HTTP via 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 = $"Olá, {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 trabalhar com HTTP, será necessário instalar o pacote Amazon.Lambda.APIGatewayEvents.
3. Deploy e teste da função
\n3.1 Teste local
\nAntes do deploy, verifique o código localmente com dotnet lambda invoke:
dotnet lambda invoke --payload "{\\"Records\