Conceitos básicos do .NET com funções do AWS Lambda

Conceitos básicos do .NET com funções do AWS Lambda

O AWS Lambda Functions é um modelo de computação sem servidor que permite executar código sem servidores. Eles geralmente são escritos em linguagens como JavaScript e Python, mas a AWS agora oferece suporte a muitos tempos de execução diferentes, inclusive. NET para C#.

Por que usar. NET para Lambda?

Existem muitos idiomas diferentes disponíveis para o Lambda agora, então você tem muitas opções. Normalmente, JavaScript e Python são usados ​​para funções de automação simples que cuidam de começar a funcionar rapidamente. Mas eles não são os mais eficientes para processamento pesado, e linguagens de script de tipagem dinâmica são uma séria desvantagem para aplicativos complexos.

Se você preferir a linguagem C#, usá-la para Lambda não tem muitas desvantagens, especialmente se mudar para Python ou JavaScript for muito tedioso. As ferramentas fornecidas pela AWS também são boas e você tem acesso a todo o AWS SDK, o que significa que você pode pesquisar facilmente serviços como Lambda e DynamoDB.

Além disso, a AWS oferece suporte a todo o tempo de execução. NET, o que significa que você pode usar linguagens diferentes do C# que compilam para binários também. LÍQUIDO. C# é o mais popular, mas você também pode escrever funções lambda em F# ou VB.NET .

Como funciona?

Linguagens como Java e C# tendem a ser muito mais agradáveis, mas há desvantagens em usá-las. Ambos são compilados em bytecode que precisa ser compilado na inicialização, para que tenham mais tempo de inicialização, especialmente na inicialização a frio. Uma “inicialização a frio” é quando a AWS não executou um recurso nos últimos minutos, portanto, ele não será armazenado em cache e precisará compilar novamente a tempo de executá-lo. Esse processo pode fazer com que suas funções demorem um segundo ou mais para responder, o que não é bom para aplicativos da web.

No entanto, esse problema é bastante atenuado se você usar o Lambda com muita frequência. Você também pode reduzir completamente os tempos de inicialização a frio com paralelismo dedicado . Tempo de resposta típico para. NET é muito grande e o desempenho está no mesmo nível de linguagens totalmente compiladas, como Go e Rust.

Se você estiver usando Java para funções Lambda, o C# pode ser um substituto viável, pois é um tempo de execução moderno. NET 6 usa menos memória e, na maioria dos casos, inicializa mais rápido que a JVM.

Configurando funções lambda em C#

Primeiro, você precisará de um instalado. LÍQUIDO. Suporte da AWS. NET Core 3.1 e. NET 6, portanto, qualquer um desses dois tempos de execução funcionará, mas o mais importante, você precisará dotnet da CLI instalada para poder instalar os modelos do Lambda. Você pode obter. NET do Portal de Documentação da Microsoft .

Você precisará instalar modelos Lambda e ferramentas Lambda globais.

dotnet new -i Amazon.Lambda.Templates

dotnet tool install -g Amazon.Lambda.Tools

Isso configura muitas opções; você pode listá-los todos com:

dotnet new --list

Esta ferramenta é bastante útil, pois vem com muitos modelos empacotados pré-configurados para diferentes casos de uso. Normalmente, você precisará de uma função por projeto para manter os tamanhos de compilação pequenos, mas poderá ter várias funções em uma única DLL se usar modelos sem servidor da AWS implantados usando modelos do CloudFormation. Eles são muito mais difíceis de gerenciar, portanto, use-os apenas se beneficiarem você.

No entanto, com arquivos de solução. NET, você pode ter vários projetos paralelos referenciando assemblies compartilhados, então isso não é grande coisa.

Por enquanto, usaremos um modelo simples de “Função vazia” que cria um projeto usando. NET 6. Você pode criá-lo a partir da linha de comando ou da nova tela de projeto do seu editor.

dotnet new lambda.EmptyFunction --name SimpleLambdaFunction --profile default --region us-east-1

Isso gera uma função muito simples – pega uma string como entrada e também passa ILambdaContext. Essa Main() é a função de ponto de entrada para o Lambda e será chamada pelo tempo de execução sempre que a função do Lambda for chamada. Essa função específica retorna string, mas você também pode fazer isso async e retornar Task<string?>.

Na parte superior, você verá um atributo de assembly que configura o serializador JSON. Internamente, o Lambda desserializará o conteúdo de entrada para você e, em seguida, chamará sua função. Posteriormente, se retornar algo, será gravado no fluxo de resposta. As bibliotecas do Lambda lidam com esse padrão para você, e o código que envolve sua função está no arquivo HandlerWrapper.

Basicamente, ele lidará com todos os tipos de assinaturas de método e, se sua função receber entrada, desserializará essas entradas para você. Se sua função retornar uma saída, ela serializará essa saída para você. Você realmente não precisa fazer nada disso, pois pode escrever funções que operam em Stream classes brutas, mas é uma boa classe wrapper para facilitar as coisas.

Isso significa que você é livre para definir seus próprios modelos para as entradas e saídas passadas de e para a função, que é um dos benefícios do processamento JSON com C#.

Nesta função, ele desserializa InputModel a classe, aguarda de forma assíncrona por um segundo e, em seguida, retorna OutputModel a classe. Essa classe é serializada de volta ao fluxo de saída para que o Lambda possa processá-la.

Executando funções lambda

Executar uma função depois de criá-la é muito fácil porque a interface de linha de comando do Lambda. NET fornece um método para implantá-lo. Basta correr deploy-function com

dotnet lambda deploy-function SimpleNETFunction

Você precisará selecionar uma função do IAM ou criar uma nova e pode ser necessário adicionar permissões a essa nova função. Agora você deve ver a função no console:

O Lambda fornece um testador integrado para o qual você pode passar o JSON.

Isso executará e mostrará todos os detalhes sobre a execução. Nesse caso, com uma função mínima muito pequena, o tempo de partida a frio foi inferior a 500 ms, o que é bastante decente. NET e para Lambda em geral. Assim que esquenta, a duração paga é reduzida para alguns milissegundos.

Nesse caso, a função não usou muita memória e reduzir a função para 128 MB não causou nenhum problema.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *