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.
Top comments (0)