Como criar um backend pro seu frontend com AWS Lambdas
Tags: frontend, webdev, aws, javascript
Published: 2024-03-25 03:20:11

Embora eu não seja o cara do backend, eu sempre tive muito contato com o desenvolvimento de APIs mesmo enquanto front, mas Lambdas foram algo que eu sempre ignorei.

Primeiro eu achava complicado, depois desnecessário porque eu achava mais fácil subir uma aplicação, até o dia que eu resolvi dar uma chance pro negócio e cara, vale a pena.

No youtube tem vídeo antigo falando sobre isso, mas se você é velho que nem eu e gosta de ler, vamo lá!

Ah, e pra esse exemplo eu vou criar uma lambda que busca os dados da Faker Api. É um exemplo básico, mas mais pra frente eu vou explicar alguns casos de uso reais onde ele pode ser útil.

## Criando a lambda

A real é que você não precisa ser o bichão do backend pra trabalhar com lambdas. Criar uma é bem simples e pode ser criada direto do painel da AWS. Pra começar, acesse o [painel das lambdas](https://console.aws.amazon.com/lambda/home) e clique em **Create Function**.

Ao criar, você pode usar um blueprint que já contém alguns exemplos como conectar ao DynamoDB ou ao S3, mas pro nosso caso nós vamos de **Author from Scratch** mesmo.

Dê um nome pra function, que eu vou chamar de `faker-api`, e altere o campo architecture pra arm64 que tem um custo menor do que a x86. Você pode conferir o meu setup aqui:

![screenshot da tela de create function](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3h1wj7mollw4ha2ymlhe.png)

## Implementando a Faker Api

Function criada, agora vamos implementar o nosso código pra buscar os dados da faker api. Você deve substituir o código padrão do index.mjs por esse aqui:

```javascript
import * as https from 'https';

function getData() {
  const apiUrl = `https://fakerapi.it/api/v1/persons?_quantity=1&_gender=male&_birthday_start=2005-01-01`;

  return new Promise((resolve, reject) => {
    const req = https.get(apiUrl, {}, res => {
      let rawData = '';

      res.on('data', chunk => {
        rawData += chunk;
      });

      res.on('end', () => {
        try {
          resolve(JSON.parse(rawData));
        } catch (err) {
          reject(new Error(err));
        }
      });
    });

    req.on('error', err => {
      reject(new Error(err));
    });
  });
}

export const handler = async (body) => {
  const res = await getData();
  
  const response = {
    statusCode: 200,
    body: res,
  };
  return response;
};
```

Explicando o código acima:

Nós temos a arrow function `handler`, que é responsável por executar a lambda. Dentro dela, eu tô chamando a função `getData` que por sua vez faz uma requisição pra Faker Api utilizando a api `https` do Node. Em seguida, faz o parser da response e retorna os dados.

A essa altura a sua lambda deve estar assim:

![Código-fonte da lambda faker-api](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n1gzo7gqc5fxo6hmhmu5.png)

Clique em **deploy** para publicar :slightly_smiling_face:

## Criando uma URL pública

Por último, vá na aba **Configuration**, clique em **Function url** e **Create function url**.

![Screenshot da página Create function url](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mibqep39bjtxff65e0od.png)

Vamos deixar o **Auth Type** como `NONE` e em Additional Settings, marque a caixa **Configure cross-origin resource sharing (CORS)**. Depois, é só clicar em **Save**. Você vai ver uma URL criada similar a essa aqui:

![Screenshot da lambda com URL criada](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6msbbp3ftor93x1k37jl.png)

Basta abrir o link no seu navegador que você vai conseguir ver os resultados. E com isso você tem um endpoint seu publicado pra utilizar no frontend. É só consumir com a função `fetch`.

```javascript
const getData = async () => {
    fetch('https://dz4y7rvv2az4iopdqzvgneefhy0jdfif.lambda-url.us-east-1.on.aws')
      .then((response) => response.json())
      .then((data) => {
        console.log('success: ', data)
      })
      .catch((error) => {
        console.error('error: ', error);
      });
  };
```

---

## Tá, agora vamos aos esclarecimentos

Você deve estar se perguntando: pra que diabos eu preciso de uma lambda pra chamar outra API pública se eu posso chamar ela diretamente? E a realidade é que você não precisa. Porém, existem alguns casos onde esse tipo básico de lambda vai te ajudar bastante:

### Proxy de API 

Nem sempre você vai querer que o frontend se conecte no seu endpoint ou possa manipular os resultados da pesquisa. No nosso exemplo, a lambda está filtrando os resultados da Faker Api pra sempre mostrar uma pessoa do gênero masculino nascida a partir de 01/01/2005, e o frontend (ou um usuário mal intencionado) não consegue mudar os filtros aplicados.

Em um caso de uso real, eu subi um servidor do Strapi e usei a lambda pra expor algumas collections sem expor a API inteira. Nesse caso, a minha lambda tinha a apiKey pra consultar o Strapi e só retornava o que era estritamente necessário pro frontend funcionar. Praticamente um BFF.

### Mock

Se você precisar subir um serviço pra simular uma API que ainda não está construída, você pode usar essa mesma lambda retornando dados estáticos respeitando o contrato da API que ainda será feita. Em minutos você vai ter um endpoint pra trabalhar que vai estar acessível de qualquer lugar.

---

É isso! E aí, curtiu? Tem alguma dúvida? Se tiver qualquer coisa que eu possa fazer pra tornar esse artigo melhor, seja reclamar, elogiar ou sugerir outro artigo, manda ver nos comentários. Feedbacks são sempre super bem vindos.