Passo a passo: Como fazer deploy de NestJS com Lambda na AWS
Tags: nestjs, node, beginners, tutorial
Published: 2023-08-08 19:32:22

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/epgixujp0k8tb0tfvx2e.png)

# Seu primeiro deploy NestJS + Lambda em 10 passos!

Se você está começando a trabalhar com aplicações serverless e quer aprender a implantar sua aplicação usando o framework NestJS e a plataforma de computação em nuvem Lambda da Amazon  (AWS), esse guia apresenta um passo a passo para criar, configurar e implantar sua aplicação na nuvem, sem complicações. Seguindo os 10 passos descritos no artigo, você terá sua aplicação rodando na nuvem em pouco tempo e poderá desfrutar dos benefícios da tecnologia serverless. Então, mãos à obra e vamos aprender juntos!

---

Antes de começarmos...

### O que é NestJS?

> O NestJS é uma escolha popular para desenvolvedores que preferem uma abordagem mais estruturada e organizada para o desenvolvimento de aplicativos Node.js, com uma sintaxe limpa e fácil de entender

### O que é Serverless e pra qual sua vantagem?

> Serverless é um modelo de computação em nuvem em que o provedor de nuvem gerencia a infraestrutura do servidor e alocando recursos dinamicamente conforme necessário para executar e escalar o código de um aplicativo. Isso significa que os desenvolvedores não precisam se preocupar em gerenciar a infraestrutura do servidor, como provisionamento, configuração, escalabilidade, atualizações de software e manutenção.

### O que é Lambda?

> Em resumo, o AWS Lambda é um serviço de computação serverless que permite aos desenvolvedores executar código sem gerenciar a infraestrutura subjacente. Com base em funções, ele pode ser usado para criar aplicativos altamente escaláveis e resilientes que respondem a eventos em tempo real.

### Pré-requisitos

- VSCode ou equivalente
- Insomnia ou equivalente
- Node >= 12

---


## Mão na massa!  


#### 01. Instalar o NestJS & serverless globalmente e criar o projeto

```
npm i -g serverless
npm i -g @nestjs/cli 
nest new first-serverless

```

#### 02. Dependências

Em seguida, vamos abrir o projeto para instalar as dependências necessárias

```
cd first-serverless
npm i @vendia/serverless-express aws-lambda
npm i -D @types/aws-lambda serverless-offline
```

#### 03. Editando controller

Podemos observar que o projeto foi iniciado com um controller base, chamado **_app.controller.ts_**, vamos reaproveita-lo e adicionar um novo endpoint

```
import { Controller, Get, Param } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }

  @Get('say/:something')
  getTest(@Param('something') word: string): string {
    return word;
  }
}

```

#### 04. Primeiro teste

Vamos ao primeiro teste, para isto, vamos iniciar a aplicação localmente da forma padrão

```
npm run start:dev
```

Agora é hora de testar a sua aplicação da forma que for mais conveniente para você: pode ser pelo navegador, Insomnia, Postman ou o que você preferir :)

`http://localhost:3000/say/hello`

Se você recebeu um resultado equivalente, tudo certo até aqui!

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/or1v10a581sudzchw7hc.png)

#### 05. Configuração AWS

Acesse o [console AWS](https://aws.amazon.com/pt/console/) e configure um novo usuário (IAM)

Para isso, após logar, procure por IAM na barra de pesquisa

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ecs9rve7lu2ghq163z4l.png)

Ao acessar o recurso, selecione usuário

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ny47siikgo2r9x5ja4j5.png)

Ao acessar o recurso, selecione "**_Adicionar usuarios_**"

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6qc9qkl0794usc0shpan.png)

Em sequencia, preenche o nome de usuário de sua preferencia e clique em próximo

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xv1ubxzq0s9evp7j6eti.png)

Seleciona "**_Anexar politicas automaticamente_**", e depois "**_AdministratorAccess_**" na aba de Politica de permissões

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ryjcqcf1j91nd0l3od5x.png)

Clicando em próximo, você chegara na etapa final e deve finalizar o cadastro clicando em "**_Criar usuário_**"

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sisawzileyb6e1fh1ian.png)

#### 06. Configurando as credenciais de acesso

Com o novo usuario criado, selecione-o na lista de usuarios para abrir a lista de recursos

Selecione "**_Credenciais de Segurança_**"

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aty4emjb3i1tyos10xfx.png)

Desça a tela até encontrar a aba "**_Chaves de acesso_**"

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/47o4g7lczjnlnh6v3p62.png)

Em sequência clique em "**_Criar chave de acesso_**", selecione a opção Command Line Interface (CLI) e depois clique em "**_Próximo_**"

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cv6mljuf3dzrwm88ipg0.png)

Defina (opcional) uma descrição para sua credencial

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hvy6e99brvhe7wg1vuul.png)

E clique em "**_Criar chave de acesso_**", guarde as informações e clique em concluir.

Com as credenciais em mãos, vamos voltar ao terminal

```
serverless config credentials --provider aws --key sua_chave_de_acesso --secret sua_chave_de_acesso_secreta
```

_**obs:** substitua os valores acima pelos dados gerados no passo anterior_

#### 07. Criar arquivo lambda

Agora que ja configuramos nossas credenciais, vamos ao passo fundamental, criar o arquivo responsável pela execução do servidor

Para isso, cria na pasta "**_src_**" um arquivo chamada lambda.ts

```
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { configure as serverlessExpress } from '@vendia/serverless-express';

let cachedServer;

export const handler = async (event, context) => {
  if (!cachedServer) {
    const nestApp = await NestFactory.create(AppModule);
    await nestApp.init();
    cachedServer = serverlessExpress({
      app: nestApp.getHttpAdapter().getInstance(),
    });
  }

  return cachedServer(event, context);
};
```

Esse arquivo será responsável por gerenciar a instancia da aplicação

#### 08. Criar arquivo serverless.yml

Na raiz do projeto (fora da pasta "**_src_**"), crie um arquivo chamado serverless.yml

```
service: serverless-example

plugins:
  - serverless-offline

provider:
  name: aws
  runtime: nodejs18.x

functions:
  main:
    handler: dist/lambda.handler
    events:
      - http:
          method: ANY
          path: /
      - http:
          method: ANY
          path: '{proxy+}'
```

> O arquivo "serverless.yml" contém as informações sobre a configuração da infraestrutura necessária para executar a aplicação serverless, incluindo a definição de funções, eventos, recursos e políticas de segurança, além de outras configurações, como variáveis de ambiente, configurações de rede e outras dependências.

#### 09. Testando o ambiente serverless localmente

```
serverless offline
```

Se tudo correu bem, você deve ser capaz de acessar o mesmo endereço: 
`http://localhost:3000/dev/say/hello`

_**obs:** Note que em ambiente de desenvolvimento foi adicionado automaticamente o prefixo /dev antes da rota_

#### 10. Deploy

Agora você está pronto para colocar sua primeira aplicação serverless no ar!

Para isso, execute o comando

```
serverless deploy
```

O console retornara a URL de acesso da aplicação, você deve ser capaz de executar as mesmas operações dos testes anteriores

Para remover o serviço, basta executar

```
serverless remove
```

---

#### Fim!

Espero que esse artigo tenha sido útil para seu primeiro passo com lambda e NestJS!

---

**Fontes:**
https://docs.nestjs.com/