tutorial succeed nodejs node modules exports example context aws node.js amazon-web-services aws-lambda aws-sdk

node.js - succeed - lambda node js tutorial



Nodejs: invoque una función AWS.Lambda desde otra función lambda (3)

A partir del 3 de diciembre de 2016, simplemente puede usar una función AWS Step para poner la función Lambda Lambda_B como el paso secuencial de Lambda_A .

Con AWS Step Functions, usted define su aplicación como una máquina de estado, una serie de pasos que en conjunto capturan el comportamiento de la aplicación. Los estados en la máquina de estados pueden ser tareas, pasos secuenciales, pasos paralelos, rutas de ramificación (opción) y / o temporizadores (espera). Las tareas son unidades de trabajo, y este trabajo puede ser realizado por las funciones de AWS Lambda, instancias de Amazon EC2 de cualquier tipo, contenedores o servidores locales; cualquier cosa que pueda comunicarse con la API de Funciones de Paso puede tener asignada una tarea.

Por lo tanto, la siguiente máquina de estado debería satisfacer sus necesidades.

Aquí está el código correspondiente a la máquina de estado.

{ "Comment": "A simple example of the Amazon States Language using an AWS Lambda Function", "StartAt": "Lambda_A", "States": { "Lambda_A": { "Type": "Task", "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME", "Next": "Lambda_B" }, "Lambda_B":{ "Type": "Task", "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME", "End": true } } }

Además, puede agregar lógicas mucho más sofisticadas en una máquina de estado, como pasos paralelos y fallas de captura. Incluso registra los detalles de cada ejecución, lo que hace que la depuración sea una experiencia mucho mejor, especialmente para las funciones lambda.

Tengo la siguiente función que utilizo para invocar una función Lambda desde mi código.

Sin embargo, cuando trato de usarlo dentro de una función Lambda, aparece el siguiente error:

AWS lambda undefined 0.27s 3 retries] invoke({ FunctionName: ''my-function-name'', InvocationType: ''RequestResponse'', LogType: ''Tail'', Payload: <Buffer > })

¿Cómo puedo invocar una función Lambda desde una función Lambda?

Mi funcion:

''use strict''; var AWS = require("aws-sdk"); var lambda = new AWS.Lambda({ apiVersion: ''2015-03-31'', endpoint: ''https://lambda.'' + process.env.DYNAMODB_REGION + ''.amazonaws.com'', logger: console }); var lambdaHandler = {}; // @var payload - type:string // @var functionName - type:string lambdaHandler.invokeFunction = function (payload, functionName, callback) { var params = { FunctionName: functionName, /* required */ InvocationType: "RequestResponse", LogType: "Tail", Payload: new Buffer(payload, ''utf8'') }; var lambdaRequestObj = lambda.invoke(params); lambdaRequestObj.on(''success'', function(response) { console.log(response.data); }); lambdaRequestObj.on(''error'', function(response) { console.log(response.error.message); }); lambdaRequestObj.on(''complete'', function(response) { console.log(''Complete''); }); lambdaRequestObj.send(); callback(); }; module.exports = lambdaHandler;


Invocar una función Lambda desde otra función Lambda es bastante simple usando el aws-sdk que está disponible en cada Lambda.

Sugiero comenzar con algo simple primero.
Este es el "Hola Mundo" de la invocación intra-lambda:

Lambda_A invoca Lambda_B con una Payload contiene un solo name:''Alex'' parámetro name:''Alex'' .
Lambda_B responde con Payload: "Hello Alex" .

Primero cree Lambda_B que espera una propiedad de name en el parámetro del event
y responde a la solicitud con "Hello "+event.name :

Lambda_B

exports.handler = function(event, context) { console.log(''Lambda B Received event:'', JSON.stringify(event, null, 2)); context.succeed(''Hello '' + event.name); };

Asegúrese de Lambda_B a Lambda_B y Lambda_A la misma función.
Por ejemplo: cree un rol llamado lambdaexecute que tenga AWSLambdaExecute y AWSLambdaBasicExecutionRole ( por alguna razón, ambos fueron necesarios ):

Lambda_A

var AWS = require(''aws-sdk''); AWS.config.region = ''eu-west-1''; var lambda = new AWS.Lambda(); exports.handler = function(event, context) { var params = { FunctionName: ''Lambda_B'', // the lambda function we are going to invoke InvocationType: ''RequestResponse'', LogType: ''Tail'', Payload: ''{ "name" : "Alex" }'' }; lambda.invoke(params, function(err, data) { if (err) { context.fail(err); } else { context.succeed(''Lambda_B said ''+ data.Payload); } }) };

Una vez que haya guardado estas dos funciones de Lambda, Lambda_A ejecutar Lambda_A :

Una vez que tenga funcionando la invocación básica intra-lambdda, puede extenderla fácilmente para invocar funciones Lambda más elaboradas.

Lo principal que debe recordar es establecer el ARN Role apropiado para todas las funciones .


Todo lo mencionado por @nelsonic es correcto, excepto los roles.

Traté de elegir los roles que mencionó anteriormente:

  • AWSLambdaExecute
  • AWSLambdaBasicExecutionRole

Pero no me permitió invocar mi otra función lambda, así que cambié la función a la siguiente:

  • AWSLambdaRole
  • AWSLambdaBasicExecutionRole

La razón detrás de esto es que AWSLambdaExecute solo proporciona Put, Get access to S3 y acceso completo a CloudWatch Logs . pero AWSLambdaRole proporciona una política predeterminada para el rol de servicio AWS Lambda. si observa su política de permisos, hablará sobre la función invoke

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "*" ] } ] }

Nota : está bien continuar sin la política AWSLambdaBasicExecutionRole , ya que solo permite que el registro en la nube no vea mucho. Pero AWSLambdaRole es absolutamente necesario.