es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Invocar funciones de AWS Lambda localmente con AWS SDK de Node.

Soy bastante nuevo ejecutando funciones de lambda localmente con sam.
Tengo esta configuración de proyecto donde una “aplicación de express de node” actúa como middleware entre internet (api gateway) y otras funciones de lambda.

En función de la ruta de recursos, se invoca otra función de lambda.

Bloque de código de invocación:

const { Lambda } = require("@aws-sdk/client-lambda");
const client = new Lambda({region: "eu-central-1"});
const input = { 
                FunctionName: "My-func",
                InvocationType: "RequestResponse",
                Payload: JSON.stringify(payload)
            };
client.invoke(input);

My-func es una función de lambda basada en Java.

Esta configuración funciona bien en lambda, pero al ejecutarlo localmente hay algunos problemas que no puedo solucionar siguiendo la siguiente configuración.

Estoy usando sam para ejecutar mis funciones de lambda.
Ejecuto mi función de Java (My-func) como sam local start-lambda -t my-func.yaml, que se ejecuta en 127.0.0.1:3001.

Ahora estoy intentando invocar esta función desde mi aplicación de nodejs. Leí algunos problemas en el repositorio de sdk de aws para especificar el punto final en la configuración de inicialización del cliente de lambda, como:

const client = new Lambda({apiVersion: '2015-03-31', endpoint: 'http://127.0.0.1:3001/'});

y usar el mismo código de arriba para invocar la función. Pero esto no funciona y falla con el siguiente error:

'$metadata': { attempts: 1, totalRetryDelay: 0 } (net.js:1144:16) { ERROR Error: connect ECONNREFUSED 127.0.0.1:3001.

Por favor, ayúdame a descubrir cómo invocar una función de lambda desde otra que se ejecuta localmente.

Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Ejecutando funciones Lambda localmente con SAM

    Como experto en TI especializado en node.js, Amazon Web Services (AWS), AWS Lambda, AWS SAM y AWS SAM CLI, intentemos solucionar el problema que estás enfrentando al invocar una función Lambda basada en Java (Mi-función) desde tu aplicación Node Express que se ejecuta localmente con SAM.

    Configuración inicial del proyecto

    Tienes una aplicación Node Express que actúa como middleware entre Internet (API Gateway) y otras funciones Lambda. Según la ruta de recursos, se invoca otra función Lambda (Mi-función).

    El bloque de código de invocación que estás utilizando es:

    const { Lambda } = require("@aws-sdk/client-lambda");
    const client = new Lambda({ region: "eu-central-1" });
    const input = { 
                    FunctionName: "Mi-función",
                    InvocationType: "RequestResponse",
                    Payload: JSON.stringify(payload)
                };
    client.invoke(input);
    

    Problemas al ejecutar localmente con SAM

    Sin embargo, la configuración funciona bien en Lambda, pero al ejecutarla localmente con SAM, hay algunos problemas que no puedes solucionar. Estás utilizando SAM para ejecutar tu aplicación Node Express y también intentando ejecutar Mi-función como sam local start-lambda -t my-func.yaml, lo cual ejecuta la función Lambda en 127.0.0.1:3001.

    Ahora, estás intentando invocar Mi-función desde tu aplicación Node Express. Leíste algunos problemas de GitHub del repositorio de AWS SDK para especificar el endpoint en la configuración de inicialización del cliente Lambda como:

    const client = new Lambda({apiVersion: '2015-03-31', endpoint: 'http://127.0.0.1:3001/' });
    

    y estás usando el mismo código que se muestra arriba para invocar la función. Sin embargo, esto no funciona y falla con el error:

    '{$metadata}': { attempts: 1, totalRetryDelay: 0 } (net.js:1144:16) {   ERROR   Error: connect ECONNREFUSED 127.0.0.1:3001
    

    Solución de problemas del problema

    Para solucionar el problema, algunas de las cosas que puedes intentar son:

    • Asegúrate de que el archivo my-func.yaml utilizado para iniciar la función Lambda localmente con SAM sea correcto y tenga todos los parámetros necesarios definidos.
    • Verifica si el número de puerto (3001) es correcto y no está siendo utilizado por ningún otro proceso.
    • Verifica si se está utilizando el endpoint correcto al inicializar el objeto cliente Lambda. El endpoint debe coincidir con el definido en el archivo my-func.yaml.
    • Verifica si la función Lambda (Mi-función) está en funcionamiento en el endpoint especificado. Puedes verificar esto navegando a `http://127.0.0.1:3001/2015-03-31/functions/Mi-función/invocations` en tu navegador web local.
    • Si la función Lambda (Mi-función) se está ejecutando en un puerto diferente, debes actualizar la URL del endpoint en consecuencia.
    • Verifica si tienes los permisos de IAM necesarios para invocar la función Lambda (Mi-función).
    • Intenta envolver el bloque client.invoke(input) con un bloque try-catch y registra cualquier error en la consola para obtener más detalles sobre el problema.

    Conclusión

    Siguiendo los pasos de solución de problemas anteriores, deberías poder identificar y solucionar el problema que estás enfrentando al invocar una función Lambda desde otra que se ejecuta localmente con SAM.

Comments are closed.