Saltar al contenido

invocar aws lambda desde otra lambda de forma asíncrona

Investigamos en distintos espacios para brindarte la respuesta a tu problema, en caso de dudas puedes dejarnos la pregunta y te contestaremos sin falta.

Solución:

Según la documentación de Lambda invocar (), verá que, de forma predeterminada, la función Lambda se invoca utilizando el RequestResponse tipo de invocación. Para invocar la función de forma asíncrona, debe especificar el Event tipo de invocación, así:

lambda.invoke(
    FunctionName: 'testLambda',
    InvocationType: 'Event',
    Payload: JSON.stringify(event, null, 2)
,function(err,data));

Estaba trabajando con la última versión actual de node.js 8.10 en AWS Lambda.
La segunda lambda no se ejecutó (y nunca se llamó a la función de devolución de llamada) hasta que usé el asíncrono/espera mecanismo.
Por lo tanto, la función del controlador debe ser asíncrona y la llamada ‘lambda.invoke’ debe estar envuelta con una Promesa.

aquí está mi código de trabajo:

function invokeLambda2(payload) 
    const params = 
        FunctionName: 'TestLambda2',
        InvocationType: 'Event',
        Payload: JSON.stringify(payload)
    ;

    return new Promise((resolve, reject) => 

        lambda.invoke(params, (err,data) => 
            if (err) 
                console.log(err, err.stack);
                reject(err);
            
            else 
                console.log(data);
                resolve(data);
            
        );     
    );



exports.handler = async (event, context) => 
    const payload = 
        'message': 'hello from lambda1'
    ;
    await invokeLambda2(payload);
    context.done();
;

Tenga en cuenta que el controlador no espera para que salga la segunda lambda, solo para que se active y se llame a la función de devolución de llamada.

También podrías devolver el Promesa desde dentro del controlador, no tiene que usar esperar con una segunda función.

No es necesario realizar ninguna importación cuando se trabaja con Promises y async/await, aparte de:

const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();

Con referencia a la respuesta de Ronginat, en lugar de envolver lambda.invoke() en una Promesa, podrías usar directamente lambda.invoke().promise() y haz algo como esto: (probado en Node.js 12.x)

exports.handler = async (event) => 

    const payload = 'hello from lambda 1';

    const params = 
        FunctionName: 'lambda2',
        InvocationType: 'Event',
        Payload: JSON.stringify(payload),
    ;

    const LambdaPromise = (params) => lambda.invoke(params).promise();

    const responseFromLambda2 = await LambdaPromise(params);

    return responseFromLambda2; //this should return StatusCode: 202, Payload: ''
;

Al final de todo puedes encontrar las explicaciones de otros creadores, tú igualmente tienes la opción de mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *