Tengo 2 funciones Lambda: una que produce una cotización y otra que convierte una cotización en un pedido. Me gustaría que la función Lambda de pedido llame a la función de presupuesto para regenerar el presupuesto, en lugar de recibirlo de un cliente no confiable.
He buscado en todas partes, pero no puedo ver cómo encadenaría o llamaría a las funciones ... ¡seguramente esto existe!
Respuestas:
Encontré una manera de usar el
aws-sdk
.Puede encontrar el documento aquí: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
fuente
InvocationType: 'Event'
parámetro (agréguelo despuésFunctionName
yPayload
). De los documentos: "Opcionalmente, puede solicitar la ejecución asincrónica especificando Event como InvocationType". Con la ejecución asíncrona, la función de devolución de llamada se llamará de manera confiable, pero sin tener que esperar a que la lambda invocada termine de ejecutarse.AWSLambdaRole
. O bien, puede agregar el siguiente objeto de declaración a la política existente de su rol: '{"Efecto": "Permitir", "Acción": ["lambda: InvokeFunction"], "Recurso": ["*"]} `Deberías encadenar tu
Lambda functions
víaSNS
. Este enfoque proporciona buen rendimiento, latencia y escalabilidad para un esfuerzo mínimo.El primero
Lambda
publica mensajes para ustedSNS Topic
y el segundoLambda
se suscribe a este tema. Tan pronto como los mensajes llegan al tema, el segundoLambda
se ejecuta con el mensaje como parámetro de entrada.Consulte Invocación de funciones de Lambda mediante notificaciones de Amazon SNS .
También puede usar este enfoque para invocar funciones Lambda de cuenta cruzada a través de SNS .
fuente
Aquí hay un código de muestra para Python,
Por cierto, también necesitarías agregar una política como esta a tu rol lambda
fuente
datetime.now()
en una cadena (o manejarlo de alguna manera). De lo contrario, obtendrá el errordatetime.datetime(2017, 9, 11, 14, 40, 53, 23834) is not JSON serializable
InvocationType
debe ser:RequestResponse
. Para obtener la respuesta de la lambda que está intentando invocar.Desde que se hizo esta pregunta, Amazon ha lanzado Step Functions ( https://aws.amazon.com/step-functions/ ).
Uno de los principios fundamentales 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 organizar interacciones complejas entre funciones sin tener que escribir el código para hacerlo.
fuente
Esta solución se realiza usando boto3 y Python:
fuente
Estaba buscando cortar el SNS hasta que vi esto en los documentos del cliente Lambda (versión Java) :
Entonces, SNS tiene una ventaja obvia: es asíncrono. Su lambda no esperará a que se complete la posterior lambda.
fuente
Amazon ha introducido funciones de pasos en AWS lambda en 2016. Creo que ahora es más conveniente usar la función de pasos, ya que es realmente fácil de usar. Puede construir una máquina de estados con dos funciones lambda como:
Puede hacerlo fácilmente de la siguiente manera:
Aquí puede tener un primer estado para producir una cotización y otro para convertir en orden
Las funciones Steps facilitan la escritura de múltiples funciones lambda y su ejecución en secuencia o en paralelo. Puede obtener más información sobre las funciones de pasos lambda aquí: Funciones de pasos
fuente
Estaba trabajando con la respuesta proporcionada por blueskin pero no pude leer la respuesta de Carga útil porque InvocationType = 'Event' es asíncrono , así que cambié como InvocationType = 'RequestResponse' y ahora todo funciona bien.
fuente
En java, podemos hacer lo siguiente:
Aquí, la carga útil es su objeto java stringificado que debe pasarse como objeto Json a otro lambda en caso de que necesite pasar alguna información de llamar a lambda a llamar a lambda.
fuente
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/
fuente
Puede invocar la función lambda directamente (por lo menos a través de Java) usando
AWSLambdaClient
como se describe en el blog de AWS' posterior .fuente
Tengo el mismo problema, pero la función Lambda que implemento insertará una entrada en DynamoDB, por lo que mi solución utiliza activadores de DynamoDB.
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/
fuente
Es una solución indirecta, pero solo llamo al punto final de la API para mis funciones lambda cuando necesito encadenarlas. Esto le permite decidir mientras codifica si desea que sean asíncronos o no.
En caso de que no desee configurar una solicitud POST, puede configurar una solicitud GET simple con un par, o ninguno, de parámetros de cadena de consulta para pasar el evento fácilmente.
- 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
fuente
Otros señalaron usar SQS y funciones de paso. Pero ambas soluciones agregan un costo adicional. Paso Las transiciones de estado de función son supuestamente muy caras.
AWS lambda ofrece una lógica de reintento. Donde intenta algo por 3 veces. No estoy seguro de si eso todavía es válido cuando lo activa, use la API.
fuente
Aquí está el ejemplo de Python de llamar a otra función lambda y obtiene su respuesta. Hay dos tipos de invocación 'RequestResponse' y 'Event' . Use 'RequestResponse' si desea obtener la respuesta de la función lambda y use 'Event' para invocar la función lambda de forma asincrónica. Entonces, las dos formas asíncrona y síncrona están disponibles.
fuente
Puede configurar el entorno AWS_REGION.
fuente