Daniel C. Patiño
sls invoke local --function hello-world
¿Te imaginas desarrollar aplicaciones serverless sin desplegar a la nube cada vez que quieres probar un cambio? Probar funciones Lambda en local con Serverless Framework es posible y te ahorra tiempo valioso de despliegue. Aquí verás cómo invocar funciones localmente y cómo el plugin Serverless Offline emula API Gateway en tu máquina.
¿Cómo invocar una función Lambda en local con Serverless Framework?
Antes de instalar plugins externos, Serverless Framework ya trae un comando nativo para ejecutar tu función sin desplegarla. La idea es simple: pruebas tu lógica directamente desde la terminal, sin esperar a que CloudFormation levante toda la infraestructura en AWS.
Para verlo en acción, primero le damos algo de dinamismo a la respuesta de la Lambda. En lugar de devolver un mensaje estático, usamos new Date() con getHours(), getMinutes() y getSeconds() para concatenar la hora actual en el body de la respuesta [02:00]. Así, cada invocación devuelve un valor distinto y confirmas que la función se está ejecutando de verdad.
El comando clave es sls invoke local, pero necesita que le indiques cuál función ejecutar, porque un mismo proyecto puede tener varias Lambdas declaradas en el serverless.yml. La sintaxis correcta es:
bash sls invoke local --function hello
¿Qué hace
sls invoke local? Ejecuta el código de una función Lambda directamente en tu máquina sin desplegarla a AWS. Solo corre la lógica del handler, no simula peticiones HTTP.
¿Por qué invoke local no es lo mismo que una petición HTTP real?
Al invocar la función con invoke local ves la respuesta en consola, pero no es idéntica a lo que recibirías desde el navegador. La razón es sencilla: en el navegador haces una petición HTTP con método GET que pasa por API Gateway, mientras que invoke local solo dispara la lógica del handler sin emular el flujo completo del ecosistema serverless de AWS.
Emular todo ese ecosistema desde cero sería muy complejo, pero la comunidad ya hizo gran parte del trabajo. Existe un plugin ampliamente adoptado que simula tanto Lambda como API Gateway en tu entorno local, y se llama Serverless Offline.
¿Qué es Serverless Offline y qué emula?
Serverless Offline es un plugin de la comunidad listado en la página oficial de plugins de Serverless Framework. Su función es emular dos servicios de AWS al mismo tiempo:
Esto significa que puedes abrir el navegador, hacer una petición GET a un endpoint local y recibir una respuesta tal como ocurriría en producción. Ideal para iterar rápido en lógicas complejas sin pagar el costo de tiempo del despliegue [05:30].
¿Cómo instalar y configurar Serverless Offline paso a paso?
La instalación toma segundos. Primero instalas el paquete con npm desde la raíz de tu proyecto:
bash npm install serverless-offline --save-dev
Esto crea la carpeta node_modules con el plugin listo para usarse. Después abres tu archivo serverless.yml y añades la sección de plugins:
yaml plugins:
Guardas el archivo y con eso le das nuevos superpoderes a tu aplicación. Para confirmar que quedó bien instalado ejecuta sls help: aparecerá una nueva sección llamada Serverless Offline entre los comandos disponibles.
¿Cómo arranco un servidor local con Serverless Offline? Ejecuta
sls offline starten la raíz del proyecto. El plugin levanta un servidor enlocalhost:3000con tus rutas listas para recibir peticiones HTTP.
¿Cómo se prueba la API en el navegador?
Al correr sls offline start, la consola muestra los endpoints disponibles. En el ejemplo, queda expuesta una ruta GET en http://localhost:3000/dev/hello [07:00]. Abres esa URL en el navegador y recibes la misma respuesta que daría AWS, con la hora actualizándose en cada recarga.
La terminal también registra cada llamada que hace la API local, lo que te permite depurar y ver el comportamiento en tiempo real.
¿Qué limitaciones tiene el desarrollo local con Serverless Offline?
Serverless Offline acelera enormemente el ciclo de desarrollo, pero no es mágico. Si modificas el código mientras el servidor está corriendo, los cambios no siempre se reflejan automáticamente. En esos casos necesitas detener el proceso y volver a ejecutar sls offline start para que tome la versión nueva.
Tampoco emula al cien por ciento todos los servicios de AWS ni los comportamientos exactos de IAM, cold starts o triggers de otros servicios. Para lógica HTTP estándar funciona muy bien; para escenarios más exóticos, te tocará probar en la nube de todos modos.
Algunas buenas prácticas que vale la pena adoptar:
sls invoke local --function <nombre> cuando solo quieras probar la lógica del handler.sls offline start cuando necesites simular peticiones HTTP completas vía API Gateway.serverless.yml o en los handlers.Con estas dos herramientas combinadas reduces drásticamente el tiempo de espera entre iteraciones, mantienes tu cuenta de AWS limpia y desarrollas con la misma agilidad que tendrías en cualquier backend tradicional. ¿Qué plugin de Serverless Framework te gustaría explorar a continuación? Cuéntalo en los comentarios.
Podemos acortar un poco el comando, en vez de ejecutar:
serverless invoke local --function hello-world or serverless offline start
Podríamos usar:
sls invoke local -f hello-world or sls offline start
Daniel C. Patiño
sls invoke local --function hello-world
analitica gc
Algo que me gusta de los profesores y que es muy distinto de otros que he visto dentro de platzi, es que te dicen y enseñan de donde ellos saben como remover o desplegar algo basado en las funciones propias de sls framework, me gusta mucho como explican y los felicito; asi es como se debe enseñar y no dar todo por entendido.
Cristian Camilo Hernández Ramirez
You can also install the plugin with the following command so you don't have to user NPM
sudo sls plugin install --name serverless-offline
This will install the node dependencies.
Santiago Espinel
En la respuesta me devuelve esto:
{ "message": "Hora: function getHours() { [native code] }:function getMinutes() { [native code] }:function getSeconds() { [native code] }" }
Es como si no ejecutara las funciones de Date ¿Alguien sabe por qué pasa y cómo arreglarlo?
Santiago Espinel
Ya descubrí el error. La Lambda Function espera un string en el response, pero como se hizo con Template Literals, por alguna razón que desconozco no entendió bien.
Entonces, simplemente hice lo mismo pero antes lo guardé en un string y ahí sī usé JSON.stringify()
DANIEL VILLALOBOS
Starting Offline at stage dev (us-east-1)
Offline [http for lambda] listening on http://localhost:3002
Function names exposed for local invocation by aws-sdk:
* hello: hola-dev-hello
┌─────────────────────────────────────────────────────────────────────────┐
│ │
│ GET | http://localhost:3000/hello │
│ POST | http://localhost:3000/2015-03-31/functions/hello/invocations │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Gagandeep Dass
Para ahorrar tiempo por ejemplo lo que yo hago es definir en el package.json en el apartado de scripts
Asi, con solo ejecutar npm run dev estaría ejecutandolo en entorno dev con el pluguin del serverless offline
"scripts": { "dev": "serverless offline --stage dev", "deploy:dev": "serverless deploy --stage dev", "deploy:staging": "serverless deploy --stage staging", "deploy:prod": "serverless deploy --stage prod", "logs": "serverless logs -f", "test": "echo \"Error: no test specified\" && exit 1" },
Yamili Mateo
Al correr el invoke local --function hello-world me aparece esto: Error: Exception encountered when loading /Users/selenebautista/hola-mundo/handler
Mario Alexander Vargas Celis
ecomendaciones
bucket-serverless-course-123213 por otro único.AttributeDefinitions y GlobalSecondaryIndexes.Gerardo Ferreyra
Tips
Para obtener el --help de cualquier comando, se puede tipear command --help, es decir, si deseamos ver la ayuda del comando start, hacemos sls offline start --help y nos mostrará toda la ayuda.
Lo mismo se puede aplicar con cualquier otro comando que se desee saber su ayuda.