Serverless Framework: 3 dicas rápidas
Tags: ptbr, serverless, webdev, webpack
Published: 2020-05-10 03:00:05

Algumas dicas rápidas ao desenvolver aplicações com Serverless Framework:

## #1 - Faça o bundle do aws-sdk

O `aws-sdk` está presente no ambiente de execução do AWS Lambda, mas você não deve confiar na versão presente por lá. Ao invés disso, você deve fazer o bundle do `aws-sdk` que você estiver utilizando:

- O ambiente de execução do AWS Lambda não está sempre na última versão, provavelmente faltando patches, atualizações de segurança etc
- Isso introduz diferenças nos seus testes
- A AWS pode atualizá-lo sem aviso prévio, até agora não ouvi falar de alguém que tenha problemas no Node.js. Mas, há algum tempo, muitas das funções Python começaram a falhar sem nenhuma ação do usuário porque a AWS atualizou a versão do boto3 no ambiente, e essa versão tinha um bug
- Não faz diferença para a performance do "cold start", seja importando do ambiente ou do meu bundle, o simples fato de importá-lo já expõe a execução a mais latência
- o `aws-sdk` não é tão grande e faz uma diferença superficial ao tempo de deploy

Também é uma recomendação da AWS: Sempre faça o bundle da sua versão do `aws-sdk`.

## #2 - Não importe todo o aws-sdk se você não precisa

A documentação da AWS usa o seguinte exemplo:

```js
// Load the AWS SDK for Node.js
const AWS = require('aws-sdk');

// Create DynamoDB document client
const docClient = new AWS.DynamoDB.DocumentClient();
```

Isso resulta na importação de todo o SDK, ao invés de apenas o serviço que você precisa, que pode ser feito da seguinte maneira:

```js
const DynamoDB = require('aws-sdk/clients/dynamodb')
const documentClient = new DynamoDB.DocumentClient()
```

O exemplo acima economiza `141ms` no tempo de inicialização, ou uma enorme redução de 33%.

Você pode ver um análise completa [nesse outro artigo](https://dev.to/oieduardorabelo/aws-serverless-vale-a-pena-importar-o-aws-sdk-7nk).

## #3 - Use o webpack para bundle

O `webpack` é descrito como um empacotador de módulo estático para JavaScript. Quando o `webpack` processa seu aplicativo, ele cria internamente um gráfico de dependência que mapeia todos os módulos de que seu projeto precisa e gera um ou mais pacotes configuráveis. Em teoria, isso significa que você pode reduzir significativamente o tamanho da função, pois ela apenas extrai o código relevante necessário. Podemos usar o [serverless-webpack](https://github.com/serverless-heaven/serverless-webpack) como plugin para o Serverless Framework.

Para começar, instale o seguinte:

```bash
$ npm install webpack --save-dev
$ npm install webpack-node-externals --save-dev
$ npm install serverless-webpack --save-dev
```

A próxima etapa é incluir o plugin e a configuração do plugin no `serverless.yml` arquivo:

```yml
plugins:
  - serverless-webpack
...
custom:
  webpack:
    webpackConfig: 'webpack.config.js'   # Name of webpack configuration file
    includeModules: false   # Node modules configuration for packaging
    packager: 'npm'   # Packager that will be used to package your external modules
```

Por padrão, o plugin procura por um `webpack.config.js` no diretório do seu projeto. Eu usei a seguinte configuração básica:

```js
module.exports = {
  entry: {
    'functions/index': './functions/index.js',
    'functions/data/getNextQuestion': './functions/data/get-question.js',
    'functions/constants/constants': './functions/constants/constants.js',
  },
  mode: 'production',
  target: 'node'
}
```

Isso resulta na redução do tamanho do pacote de 8MB para menos de 1MB.

---

# Créditos

- [Serverless Top Tips](https://teachmyselfcloud.com/post/serverless-top-tips.html), escrito originalmente por [Matt Lewis](https://twitter.com/m_lewis).