Serverless Framework: 3 dicas rápidas
Eduardo Rabelo
Posted on May 10, 2020
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
- Serverless Top Tips, escrito originalmente por Matt Lewis.
Posted on May 10, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.