Optimizando el cold starts o inicio en fr铆o con webpack

A pesar de que AWS hace un excelente trabajo para que se note lo menos posible el cold starts de una funci贸n lambda, a煤n hay cosas que podemos hacer para ayudar a reducir ese tiempo. En lo personal me parece incre铆ble que en 4 segundos se levante un servidor, quien sabe donde, conecte a la base de datos, haga las operaciones y responda.

驴Como se puede mejorar?

Cada vez que se llama una funci贸n lambda, se empaqueta el c贸digo de la funci贸n y se manda a un servidor, es uno de los primeros pasos en el proceso de una lambda, si nosotros subimos nuestro c贸digo ya empaquetado con serverless-webpack vamos a reducir notablemente la carga que corresponde a ese ciclo del proceso.

serverless-webpack

Nos ofrece todos los beneficios de webpack al empaquetar nuestro c贸digo, entre ellos:

  • Limpiar el c贸digo, para que en nuestras funciones quede solo el c贸digo que realmente se requiere.
  • Optimiza las dependencias o m贸dulos.
  • Comprime nuestro c贸digo en un archivo.
  • Hot reload en ambiente de desarrollo.

Instalaci贸n

Lo primero que debemos hacer es instalar webpack y serverless-webpack como dependencias de desarrollo en nuestro repositorio:

npm i --save-dev serverless-webpack webpack

Configuraci贸n

Agregamos el plugin en nuestro archivo serverless.yml, nos aseguramos de colocarlo de primero entre los plugins, si tienes otros instalados:

plugins: - serverless-webpack ... // otros plugins...

En la ra铆z de nuestro proyecto al lado del archivo serverless.yml agregamos el archivo webpack.config.js y lo llenamos con el siguiente c贸digo:

const slsw = require('serverless-webpack'); module.exports = { target: 'node', entry: slsw.lib.entries, mode: slsw.lib.webpack.isLocal ? 'development' : 'production', node: false, optimization: { minimize: false, }, // en caso de que uses sequelize debemos omitir los controladores que no estemos usando // en el ejemplo anterior estoy usando mysql // es un bug que esta en espera de soluci贸n [issue #7509](https://github.com/sequelize/sequelize/issues/7509) externals: ['pg', 'sqlite3', 'tedious', 'pg-hstore'], devtool: 'inline-cheap-module-source-map', };

Aqu铆 hay dos cosas importantes:

  • node: false poco usual, pero cuando se configura true puede causar problemas con las variables de ambiente que se utilizan en la aplicaci贸n.
  • minimize: false para poder tener un mejor stack traces al momento de tener errores. Es opcional activarlo en caso de que quieras mejorar a煤n m谩s el empaquetado de tus funciones.

En este punto ya hemos optimizado el empaquetado de nuestras funciones, puedes probarlo con el comando:

serverless package

Este generar谩 un archivo con todas tus funciones, se puede optimizar un poco m谩s agregando a nuestro archivo serverless.yml el parametro:

... package: individually: true ...

Este par谩metro har谩 que demor茅 unos minutos m谩s el empaquetado pero generar谩 un paquete de c贸digo por cada funci贸n de forma individual.

Tambi茅n puedes seguir usando el comando:

sls offline start --skipCacheInvalidation

Y ahora ver谩s un mensaje de que el servidor est谩 esperando cambios, as铆 hemos ganado mejor performance y hot reload en nuestro ambiente de desarrollo.

Actualizado 19/04/2020 a las 22:33