Categorias
backend

Serverless para iniciantes

Quando ouvi a palavra serverless pela primeira vez, levei a tradução ao pé da letra e pensei que se tratava de um projeto onde não existiria um servidor. Mas não é bem isso…

E criei esse artigo pra te contar o que entendi sobre o assunto. Dessa forma acredito que pode rolar uma troca legal entre a gente: de um lado, eu vou consolidar meus estudos iniciais da arquitetura serverless e do outro, você fica conhecendo mais um ponto de vista sobre o assunto. Então aqui vou falar sobre:

  • O que é serverless
  • Quais os benefícios de usar serverless
  • Qual a importância de devs aprenderem a criar soluções serverless
  • Como criei experiência ao estudar serverless
  • Tutorial de “Hello, world!” na arquitetura serverless

O que é serverless?

Serverless é uma arquitetura orientada a eventos e não é que não exista um servidor, na real a gente não precisa se preocupar com a configuração de um servidor, pois o provedor de nuvem que usaremos fará isso pra gente.

Além disso, na arquitetura serverless, as aplicações são iniciadas apenas quando um evento aciona a execução do código da aplicação de forma dinâmica.

Dos modelos de serverless que existem aqui embaixo estão alguns dos mais populares:

  1. BaaS – Backend as a Service, como o Firebase do Google Cloud Platform
  2. FaaS – Function as a Service como AWS Lambda e Azure function

Quais os benefícios de usar serverless?

Mas você deve estar se perguntando, quais as vantagens de começar a usar serverless, não é mesmo? Dentre uma lista extensa de benefícios que fazem as empresas decidirem por usar serverless posso destacar estes 3:

  •  A escalabilidade da aplicação é automática
  •  A configuração de deploy é super simples
  •  Só pagamos pelo que usamos

A arquitetura serverless popularizou quando as empresas entenderam que podem crescer sua infraestrutura com redução de custos e de forma automática.

Além disso, é possível usar serverless na linguagem de programação que o time já utiliza, facilitando ainda mais a adesão.

Qual a importância de devs aprenderem a criar soluções serverless?

Soluções serverless garantem facilidade no dia a dia de trabalho, para determinados projetos, onde muitas configurações já existem, como por exemplo de conteinerização, escalonamento e muitas outras.

Dessa forma, podemos nos concentrar em criar regras com qualidade, explorando o ágil e utilizando boas práticas.

Podemos também acessar diversas oportunidades ao sermos capazes de gerar crescimento para os negócios em que colaboramos com economia utilizando serverless.

Tenta uma coisa? Pesquisa no LinkedIn a quantidade de vagas disponíveis para quem tem esse conhecimento. Eu pesquisei aqui com o termo AWS Lambda e encontrei quase 400 vagas para o Brasil. Bastante, não?

Criando experiência enquanto estudo

Meu primeiro projeto serverless usando AWS Lambda do zero ao deploy

Minha primeira experiência com serverless foi realizando um projeto guiado, no curso Ignite da Rocketseat, no módulo de backend com Node.js nas aulas da maravilhosa Dani Leão.

A gente fez uma aplicação que cria e valida um certificado de conclusão de curso gerando uma versão pdf. Se liga no resultado abaixo!

A request de criação do certificado:

O pdf gerado:

Para isso utilizamos as tecnologias abaixo:

  • Typescript
  • Framework serverless
  • AWS Lambda
  • DynamoDb
  • S3
  • puppeteer
  • handlebars

Algumas lições aprendidas:

  • Como criar uma lambda
  • Tipagem da aws-lambda
  • Criei minha conta aws e configurei as credenciais na minha máquina
  • Como usar o dynamoDb offline
  • Como rodar o projeto serverless offline
  • Como fazer deploy da solução
  • O uso de algumas libs pra transformar data e pra gerar pdf
  • Como usar S3
  • Como consultar o log na aws
  • O principal aprendizado foi entender o arquivo serverless.ts e que ele pode ser no formato yml também
  • Como criar e rodar um projeto com o framework serverless usando o esbuild

O código completo você pode conferir aqui no meu repositório: https://github.com/simaraconceicao/serverless

Tutorial: “Hello, Serverless!”

Agora que você já sabe os motivos pelos quais deveria aprender a criar projetos usando a arquitetura serverless, chegou a hora de colocar a mão no código e vamos dar um hello world com serverless. 

Aqui a gente vai fazer um tutorial rodando localmente, ou seja não faremos deploy na AWS.

Requisitos: É preciso ter instalado o “node”: “>=14.15.0”.

Passo 1:  Instalar o framework serverless 

Um boilerplate para gerar projetos aws lambda. Você pode ler mais detalhes aqui na documentação: https://www.serverless.com/

Comando:

npm install -g serverless

Verifique se instalou corretamente usando o comando:

serverless --version

Deverá retornar as versões instaladas.

Passo 2: Criar o projeto usando o template aws-nodejs-typescript

Comando:

serverless create --template aws-nodejs-typescript --path nome-do-projeto

Passo 3: Entrar no projeto, instalar as dependências e abrir no vscode

Comandos: 

cd nome-do-projeto
npm i
code .

Passo 4: Excluir arquivos default (pasta de libs e pasta hello)

Antes de excluir estava assim:

 

Após excluir os arquivos default, sua estrutura de pastas vai ficar assim:

Passo 5: Hello, Serverless!

Criar um arquivo dentro da pasta functions e nomear de hello.ts 

Código:

import { APIGatewayProxyHandler } from 'aws-lambda'

export const handler: APIGatewayProxyHandler = async (event) => {
 return {
  statusCode: 200,
body: JSON.stringify({
message: 'Hello, Serverless!'
})
}
}

Passo 6: entender estruturas de pastas, principalmente arquivo serverless.ts

├── src

│   ├── functions               # Lambda configuration and source code folder

│      ├── hello.ts

│  

├── package.json

├── serverless.ts               # Serverless service file

├── tsconfig.json               # Typescript compiler configuration

├── tsconfig.paths.json         # Typescript paths

└── webpack.config.js           # Webpack configuration

Passo 7: Dentro do arquivo serverless.ts mudar importação do arquivo hello

Importar a funcao via path, excluir importação que vem por default dos arquivos e pastas que excluímos.

Código:

// import the function via paths
functions: {  
hello: {
 handler: "src/functions/hello.handler",
events: [
{
http: {
path: "hello",
method: "get",
cors: true
}
}
]
}
}


Passo 8: Incluir plugin serverless offline

Comando:

npm i serverless-offline -D

Inserir config de plugin no arquivo serverless.ts 

Código:

plugins: ['serverless-offline'],

Observação

Como o arquivo serverless.ts estava antes por default:

Como o arquivo serverless.ts ficou após todas as alterações:

Passo 9: rodar projeto localmente

Comando:

serverless offline

 

Passo 10: acessar o link que aparece no terminal que é a request get

Resultado:

Conclusão

Espero que esse artigo te ajude a dar os primeiros passos com AWS Lambda. Se você tentou fazer o hello world e precisa de ajuda, pode consultar esse meu repo aqui: https://github.com/simaraconceicao/hello-serverless.

Caso queira trocar ideia sobre esse ou outro conteúdo, vou adorar te receber na comunidade do telegram quero ser dev: https://t.me/queroserdev

Até o próximo post!

Categorias
backend

Desafio 6 CRUDs MongoDB em 2 semanas

Fiz 6 projetos de CRUD MongoDB, ao longo de 10 dias, com o objetivo de consolidar o meu aprendizado. E compartilho aqui a evolução e as lições aprendidas.

Apresentação

Prazer, Simara Conceição! Eu sou desenvolvedora grad na ThoughtWorks, professora na {reprograma} e criadora do Podcast Quero Ser Dev.

Gif Yeah

Iniciei minha migração para área de tecnologia em 2019, você pode conhecer essa história completa ouvindo o quero ser dev.

Motivação para criar esse desafio

Fui convidada para ensinar na Reprograma para mais de 40 mulheres iniciantes em backend como criar um CRUD MongoDB usando o mongoose.

E toda vez que estou me preparando para uma aula eu fico imersa no conteúdo pensando em construir a melhor experiência possível para minhas queridas alunas.

Eu embarquei nesse desafio, pois acredito que não há nada que a gente saiba tão pouco que não possa compartilhar.

Quando conheci MongoDB

Eu tenho uma história engraçada sobre como me apaixonei pelo MongoDB, rs.

Em 2020, antes de entrar na TW eu apliquei pra lá em uma vaga de dev full stack. Lembro que a entrevista foi em inglês e com uma colaboradora baseada em NYC e uma das primeiras perguntas foi: você já usou nossa ferramenta?

E eu bem garota, faceira, ousada, iniciante mais que tudo respondi que não havia ainda tido a oportunidade de usar, mas que era uma entusiasta.

Fui reprovada, óbvio, rs. A verdade é que eu tinha ficado feliz demais só de ter sido considerada para vaga, ao ser convocada para essa primeira entrevista.

Saí de lá decidida a usar o MongoDB em meus projetinhos de estudo e ganhar mais maturidade em padrão de projeto e melhores práticas de desenvolvimento.

Afinal de contas, eu queria carreira em uma empresa global, que tivesse um programa explicito de diversidade e de desenvolvimento para as pessoas colaboradoras.

Fico feliz de ter alcançado tudo isso aqui na empresa que estou atualmente, a gente só consegue conectar os pontos olhando pra trás, já dizia Jobs. <3

O que é um CRUD?

Pra quem tá chegando agora, CRUD é um acrônimo para Create, Read, Update e Delete(criação, consulta, atualização e remoção de dados). São as 4 operações principais em um banco de dados.

Resumo de cada CRUD que criei :

  1. Primeiro: Cadastro de inscritos no canal
  2. Segundo: Cadastro de episódios de podcast
  3. Terceiro: Cadastro de filmes
  4. Quarto: Cadastro de livros
  5. Quinto: Cadastro de séries
  6. Sexto: Cadastro de estudios e títulos

As informações de ferramentas utilizadas, requisitos, arquitetura e também os códigos, você encontra aqui nesse repositório: https://github.com/simaraconceicao/node-mongo-mongoose

 Lições aprendidas

 Procurando direitinho tem muito conteúdo incrível no youtube

A ideia original desses projetinhos foram retiradas desse tutorial do canal Web Dev Simplified. Obrigada Kyle! haha

Build A REST API With Node.js, Express, & MongoDB – Quick

Já a parte de relacionamento, eu me inspirei nesse vídeo aqui da Rocketseat. Valeuu, Diego! rs

API NodeJS + Express + Mongo – CRUD e relacionamentos com MongoDB

Eu fiz o projeto 1 acompanhando o tutorial do Kyle e a partir do projeto 2 fui implementando e modificando conforme meu repertório ia deixando, rs.

Para ter embasamento teórico assisti aulas de de data driven, aulas de conceitos, mapa mental sobre tipos de bancos de dados. Aqui está um comparativo entre SQL e NoSQL:

NoSQL

Surgiu no final dos anos 90 e como uma alternativa de natureza não relacional.

Possuem alta escalabilidade e desempenho.

Alguns tipos de bancos de dados não relacional: armazenamento de chave-valor, armazenamento column family, orientado a grafos e orientado a documentos.

SQL

RDBMS ou Sistema de Gerenciamento de Banco de Dados Relacional, armazenam dados em um formato estruturado, usando linhas, colunas e tabelas.

Structured Query Language, ou Linguagem de Consulta Estruturada ou SQL, é a linguagem de pesquisa declarativa padrão para banco de dados relacional.

Geralmente demanda distribuição vertical de servidores, o que gera mais custo, pois quanto mais dados, mais memória e mais disco um servidor precisa.

Aqui está um comparativo dos termos MongoDb e SQL:

| MongoDB | SQL |
| — | — |
| `database` | database|
| `collection` | table|
| `document` | row|
| `field` | column|
| `lookup` | table joins|

Referência: https://docs.mongodb.com/manual/reference/sql-comparison/

Repetição é importante demais

A cada dia, ficava mais fluído entender a responsabilidade de cada arquivo, a lógica de cada função do CRUD, percebia os comportamentos e conseguia lidar melhor com os erros também.

Mas Simara, faz sentido criar basicamente o mesmo projeto 6 vezes? Faz muito sentido! De tanto repetir, eu comecei a não precisar consultar o tutorial ou algum projeto meu anterior.

O último então fluiu que só. Consegui desenhar toda a estratégia de como compartilhar o conhecimento com as meninas, comparando com o que elas já viram antes conectando pontos para o entendimento fluir melhor.

Começando com o MongoDb

Os dados são armazenados no formato que se parece muito com JSON, o que é uma grande facilidade para quem já programa com Javascript.

Podemos usar o Mongo pelo serviço de nuvem(cloud) ou localmente fazendo o download para nossa máquina (eu usei essa opção) e ainda é possível integrar as 2 formas.

Além disso, o Mongo possui seu driver com suas próprias queries(comandos para interação com o banco que se assemelham muito com javascript com orientação a objeto), podemos também usar uma interface gráfica(usei o MongoDb Compass) e ainda podemos usar um ODM, ferramenta que mapeia entre nosso objeto e a db(usei o mongoose).

Teste, teste e teste

Eu não criei uma estratégia de testes, mas fiz testes manuais com Insomnia e tratei os possíveis erros para retornar status e mensagens coerentes.

Não usei o driver do MongoDB, usei a interface gráfica MongoCompass para verificar se meus dados estavam salvando direitinho.

Mongoose faz um meio de campo lindão entre nosso projeto e o MongoDb

Sabe quando a gente inventa de editar uma foto no photoshop, mesmo sabendo que existem filtros prontos que fazem um ótimo trabalho? Então usar o mongoose é apelar para templates prontos, lindos e rápidos.

– Mas muita atenção, pois a comunicação dele com o MongoDB é feita de forma assíncrona.
– Passando nossa string de conexão e informações default é possível fazer a Criação da conexão com a db e também tratar os erros.
– Mas o melhor de todos os pontos, é que ele cria nosso model, informando exatamente como nossos documentos e collections serão. <3

 Separar as responsabilidades faz sentido demais

A partir do terceiro projeto fui percebendo o quanto os arquivos de server e de routes estava ficando densos e estranhos com tantas informações, dessa forma modularizei melhor e separei a minha lógica. Você pode perceber a diferença do primeiro para o último.

Compartilhar conhecimento/vivência é disparada a melhor maneira para aprender de forma eficiente

Repito: não há nada que a gente saiba tão pouco que não possa compartilhar.

Estou em constante aprendizado, nessa minha rotina de transição, mas eu só tenho segurança pra dizer que entendi algo de verdade depois que eu compartilho esse conhecimento.

Além disso, compartilhar é uma troca linda e eu sempre aprendo muito com essas vivências. <3

Próximos passos

Quero me aventurar com infra e fazer o deploy de algum desses CRUDs, permitindo de forma pública as integrações e também penso em implementar uma estratégia de testes automatizados.

É isso, pessu! Me enviem feedbacks sobre esse artigo e sobre essa minha forma de estudar.Vou amar trocar ideias com vocês. Até a próxima!