loading...

Serverless Framework: 3 dicas rápidas

oieduardorabelo profile image Eduardo Rabelo ・3 min read

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:

// 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:

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.

#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 como plugin para o Serverless Framework.

Para começar, instale o seguinte:

$ 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:

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:

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

Discussion

markdown guide