¿Puede una función AWS Lambda llamar a otra

Tengo 2 funciones de Lambda, una que produce una cotización y otra que convierte una cotización en una orden. Me gustaría que la función Order lambda llame a la función Quote para regenerar el presupuesto, en lugar de solo recibirlo de un cliente que no sea de confianza.

He buscado en todas partes en las que puedo pensar, pero no puedo ver cómo encaminar o llamar a las funciones … ¡seguramente esto existe!

Encontré una forma de usar el aws-sdk .

 var aws = require('aws-sdk'); var lambda = new aws.Lambda({ region: 'us-west-2' //change to your region }); lambda.invoke({ FunctionName: 'name_of_your_lambda_function', Payload: JSON.stringify(event, null, 2) // pass params }, function(error, data) { if (error) { context.done('error', error); } if(data.Payload){ context.succeed(data.Payload) } }); 

Puede encontrar el documento aquí: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

Debe encadenar sus Lambda functions través de SNS . Este enfoque proporciona un buen rendimiento, latencia y escalabilidad para un mínimo esfuerzo.

Su primer Lambda publica mensajes en su SNS Topic y el segundo Lambda está suscrito a este tema. Tan pronto como llegan mensajes al tema, se ejecuta el segundo Lambda con el mensaje como su parámetro de entrada.

Consulte Invocar funciones de Lambda con las notificaciones de Amazon SNS .

También puede usar este enfoque para invocar funciones Lambda de cuenta cruzada a través de SNS .

aquí hay un código de muestra para Python,

 from boto3 import client as boto3_client from datetime import datetime import json lambda_client = boto3_client('lambda') def lambda_handler(event, context): msg = {"key":"new_invocation", "at": datetime.now()} invoke_response = lambda_client.invoke(FunctionName="another_lambda_", InvocationType='Event', Payload=json.dumps(msg)) print(invoke_response) 

Por cierto, necesitaría agregar una política como esta a su función lambda también

  { "Sid": "Stmt1234567890", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "*" } 

Estaba buscando eliminar SNS hasta que vi esto en los documentos del cliente Lambda (versión de Java) :

Cliente para acceder a AWS Lambda. Todas las llamadas de servicio realizadas con este cliente están bloqueadas y no volverán hasta que se complete la llamada de servicio.

Entonces, SNS tiene una ventaja obvia: es asincrónico. Su lambda no esperará a que se complete la lambda posterior.

Desde que se hizo esta pregunta, Amazon lanzó Step Functions ( https://aws.amazon.com/step-functions/ ).

Uno de los principios fundamentales detrás de AWS Lambda es que puede centrarse más en la lógica empresarial y menos en la lógica de la aplicación que lo une todo. Las funciones de paso le permiten orquestar interacciones complejas entre funciones sin tener que escribir el código para hacerlo.

Estaba trabajando con la respuesta proporcionada por blueskin, pero no pude leer la respuesta de Payload porque InvocationType = ‘Event’ es asincrónico , así que cambié como InvocationType = ‘RequestResponse’ y ahora todo funciona bien.

Es posible que pueda utilizar la función Async.js Waterfall: consulte la parte inferior del fragmento de código grande en el Paso 3 de este documento para ver un ejemplo:

https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/

En java, podemos hacer lo siguiente:

 AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build(); InvokeRequest invokeRequest = new InvokeRequest(); invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload); InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest); 

Aquí, la carga útil es su objeto java codificado que debe pasarse como objeto Json a otra lambda en caso de que necesite pasar alguna información de invocar lambda a lambda llamado.

Estoy teniendo el mismo problema, pero la función Lambda que implemento insertará una entrada en DynamoDB, por lo que mi solución utiliza DynamoDB Triggers.

Hago que el DB invoque una función Lambda para cada inserción / actualización en la tabla, por lo que esto separa la implementación de dos funciones Lambda.

La documentación está aquí: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html

Aquí hay un tutorial guiado: https://aws.amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/

Una especie de solución indirecta pero llamo al punto final API para mis funciones lambda cuando necesito encadenarlas. Esto le permite decidir durante la encoding si desea que sean asíncronos o no.

En caso de que no desee configurar una solicitud POST, puede simplemente configurar una simple solicitud GET con un par, o ninguna, de los parámetros de cadena de consulta para pasar fácilmente los eventos.

– Editar –

Ver: https://docs.aws.amazon.com/apigateway/api-reference/making-http-requests/

y: http://docs.aws.amazon.com/lambda/latest/dg/with-on-demand-https-example.html

Puede invocar la función lambda directamente (al menos a través de Java) utilizando AWSLambdaClient como se describe en la publicación de blog de AWS.

Puede establecer el entorno AWS_REGION.

 assert(process.env.AWS_REGION, 'Missing AWS_REGION env (eg. ap-northeast-1)'); const aws = require('aws-sdk'); const lambda = new aws.Lambda(); 

Amazon introdujo las funciones de pasos en AWS lambda en 2016. Creo que ahora es más conveniente usar la función de pasos ya que es muy fácil de usar. Puede construir una máquina de estado con dos funciones lambda como:

  • para producir una cotización
  • convierte una cita en una orden

Puedes hacerlo fácilmente de la siguiente manera:

Aquí puede tener el primer estado para producir una cotización y otro para convertir en orden

 { Comment: "Produce a quote and turns into an order", StartAt: "ProduceQuote", States: { ProduceQuote: { "Type": Task, "Resource": "arn:aws:lambda:us-east-1:123456789012:function:ProduceQuote", "next": TurnsToOrder } TurnsToOrder: { Type: Task, Resource: "arn:aws:lambda:us-east-1:123456789012:function:ProduceQuote", end: true } } } 

Las funciones de pasos hacen que sea muy fácil escribir múltiples funciones lambda y ejecutarlas en secuencia o en paralelo. Puede obtener más información acerca de las funciones de los pasos de lambda aquí: Funciones de Pasos