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.