Criando e publicando Api .Net 6 com trigger via controller para AWS Lambda (usando GitHub Actions)
O que é AWS Lambda
Vamos começar do começo, Lambda é um serviço de nuvem em formado ondemand, isso significa que você paga literalmente o quanto precisar usar, mas como assim ? poise o Lambda ou serviços como o Lambda como a Function da Azure ou o Google Function do Google Cloud sempre terão um trigger/gatilho que ira fazer um input de dados ou somente acordar a aplicação para que ela execute o que foi programado que ela execute, pode ser no acaso da AWS um arquivo novo no S3 (sistema de armazenamento da AWS) ou até a Alexa SIIMMM uma skill da alexa pode acordar seu Lambda.
O dimensionamento da Lambda é totalmente feito pela Amazon ou seja se você tiver 10 milhões de requisições para sua lambda é os servidores da Amazon que terá a responsabilidade de aumentar o numero de serviços rodando para atender as suas requisições, e o valor é cobrado por tempo de utilização do Lambda fazendo ele um dos tipos mais baratos para aplicações.
Pré-requisitos para começarmos a criação do projeto
A Amazon fornece uma extensão para o Visual Studio que auxilia e muito o processo de criação de funções Lambda então temos de ter instalados os seguintes:
Feito isso vamos começar !!!
Criando o Projeto
Abra seu Visual Studio e Clique em Criar Novo Projeto/ Create New Project
Agora irá ver que novas opções aparecem como template isso por que a extensão da AWS para o Visual Studio as trouxe para facilitar nossa vida vamos escolher a AWS Serverless Application (.Net Core — C#)
Logo após escolher o nome da aplicação você terá estas escolhas
Veja que a extensão tras dezenas de templates para o Lambda porém como estamos fazendo uma API vamos seguir com a opção:
Pronto já temos uma template criada para Lambda com um trigger via controller:
Pré-Requisito para publicação
Se você não criou um usuário do IAM, siga este link para criar um usuário do IAM e este passo a passo:
Se ainda não tem um grupo de usuários crie um
Após criar o usuário copie ID de chave de Acesso, Chave de acesso secreta e senha e os guarde em um bloco de notas por que vamos utilizar nas publicações
Publicando na AWS de Forma local
Agora com sua template criada e usuário IAM também, a publicação na AWS Lambda pode ser feito dessa forma:
Volte ao Visual Studio e Clique em Extensions -> AWS Toolkit -> Getting Started
Agora preencha a AccesKey e Secret Key que você guardou no passo anterior
Clique em Save and Close
Agora clique com o botão direito em seu projeto e escolha Publich to AWS Lambda
Escolha um nome para StackName
Crie um novo bucket s3 caso ainda não tenha um
Agora sim clique em publish e espere a magica acontecer …
Criado com sucesso
para chamar a api copie a AWS Serverless URL e coloque sua rota e pronto :
Publicando com GitHub Actions
Bom o Github oferece esteira de deploy gratuita para quem utiliza sua ferramenta de gerenciamento, subi meu código para o GitHub o link caso queiram esta aqui https://github.com/LeonardoGonSantos/ProjectExampleLambdaFunction
podem entrar para dar uma olhada caso queiram, bom após isso o conceito de ter uma esteira de deploy é sempre que uma atualização ocorrer dentro de uma branch especifica ele pode publicar automaticamente sua solução para a nuvem, digamos que a branch master é nossa branch principal a qual deve sempre estar publicada no ambiente produtivo, agora toda vez que a branch master receber um commit, através de pull Request ou de um commit direto você quer que sua aplicação seja “buildada”, tenha sua imagem publicada na AWS Lambda para que possa ser executada em ambiente produtivo ou de testes, bom esclarecido os passos vamos a mão na massa.
Criando Esteira de deploy
Ao entrar em seu projeto no github com seu codigo já “hospedado” lá, clique em Actions
Nesta aba do menu, tem todas as execuções do GithubActions que são as esteiras de deploy, agora para criar uma nova esteira clique em “New Workflow”
No nosso caso estamos criando uma esteira de deploy para .Net então o GitHub tem algumas opções pre prontas para build .net, por isso procure por .net e clique em “Configure”
Agora o GitHub criou um arquivo para você com a extensão yml, é um padrão para desenvolvimento de esteiras de deploy, builds automatizados entre outros tipos de atividades bom vamos analisar o arquivo criado
Esta primeira parte diz respeito a qual branch será o trigger da nossa esteira, então se sua branch não tiver nome de master mas sim de main altere este nome
Esta parte diz respeito ao build da nossa solução, caso seu projeto não seja .net 6 altere a versão para a qual você usa em “dotnet-version:”, você pode reparar que se esta habtuado a usar o .net cli conhecera os comandos empregados ali como “dotnet restore”, “dotnet build — no-restore” enfim ele esta rodando o cli do dotnet para poder executar o build da nossa solução
E por fim o GitHub deixa uma etapa para testes unitários , caso seu projeto tenha deixe essa parte porém como estou realizando um exemplo vou retirar da pipe
Feito a parte de build do .net vamos para a publicação na AWS tem uma biblioteca aberta que pode nos ajudar nesse deploy “Amazon.Lambda.Tools” por isso vamos instalar ela para que possamos usar suas funcionalidades para o deploy na AWS fazemos isso dessa forma:
Agora temos a ferramenta para utilizar ela tem vários comandos e funcionalidades porém a que vamos usar é para deploy na AWS Lambda dessa forma
este comando espera algumas variáveis as quais são:
— region “deve ser colocado a region onde esta sua function lambda”
— s3-bucket “nome da sua instancia s3 onde será armazenado a imagem da sua solução”
o bucket deve estar na mesma região que a lambda
— function-name “o nome que você quer que tenha sua function na aws”
Feito isso agora você precisa colocar as credenciais de acesso IAM para que possa ter permissão para publicar, se você ainda não criou veja que temos uma seção neste artigo ensinando isso com o nome de Pre Requisitos para publicação bom agora vamos adicionar essas duas linhas
essa variável que será incluída no ambiente de publicação ou seja na hora que você rodar sua esteira de deploy contem as chaves de publicação sua ACCES KEY ID e a SECRET ACCES KEY que de novo salvamos na etapa de Pre Requisitos para publicação p esta forma irá pegar os valores das secrets que você tem configurado no seu github actions e dessa forma somente você tem acesso a elas não ficam expostas em seu repositório vamos criar elas:
Vá em Settings
Agora clique em Secrets
Depois em Actions
Clique em New Repository Secret
Agora sim vamos criar primeiro a “AWS_ACCESS_KEY_ID” e depois cole o valor dela em baixo assim:
Clique em add Secret e agora vamos adicionar a outra -> New Repository Secret novamente e agora é a vez da segunda variável “AWS_SECRET_ACCESS_KEY” e depois cole o valor dela assim:
feito isso sua pipe esta configurada, e seu arquivo yml deve ter ficado dessa forma:
OBS: não esqueça de após criar seu arquivo clicar em commit changes
Bom feito isso agora hora de ver a magica acontecer no menu Actions
temos todas as publicações já executadas e agora tem que ter uma acontecendo ou já executada em seu historico pois o seu commit do arquivo yml cria um commit na master p qual é um trigger para sua esteira de deploy então deve ter algo assim aqui:
Clique nele
agora em build
Nesta pagina você tem todos os logs do que esta acontecendo
Na aba deploy lambda
Logo no final
Após finalizar a publicação tem a url da nossa aplicação colocando ela no postman e fazendo um get em nosso end point a function será acordada e terá a resposta do end point
Muito obrigado por ter lido até aqui e espero ter ajudado, mas caso não ou tenha alguma duvida pode abrir uma issue em meu repo no gitHub ou um comentário aqui tento te ajudar da maneira que puder.
Caso tenha curiosidade para ver os outros comandos o repo no git para a ferramenta de deploy é https://github.com/aws/aws-extensions-for-dotnet-cli, tem deploy para ECS, ElasticBeanstalk e Lambda.