node.js - test - porque usar lambda aws
¿Puede una función AWS Lambda llamar a otra? (15)
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 cotización para regenerar la cotización, en lugar de solo recibirla 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!
Amazon introdujo 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:
- para producir una cotización
- convierte una cotización en un pedido
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
{
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 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
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, también necesitarías agregar una política como esta a tu rol lambda
{
"Sid": "Stmt1234567890",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": "*"
}
Debe encadenar sus
Lambda functions
través de
SNS
.
Este enfoque proporciona buen rendimiento, latencia y escalabilidad para un esfuerzo mínimo.
Su primer
Lambda
publica mensajes en su
SNS Topic
y el segundo
Lambda
está suscrito a este tema.
Tan pronto como los mensajes llegan al tema, el segundo
Lambda
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 .
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.
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 encadenado 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.
Encontré una manera 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í: AWS.Lambda
Es posible que pueda utilizar la función Cascada de Async.js; 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/
Esta solución se realiza usando boto3 y Python:
import boto3
import json
invokeLambda = boto3.client(''lambda'', region_name=''eu-west-1'')
def lambda_handler(event, context):
invokeLambda.invoke(FunctionName = ''function_name'', InvocationType = ''RequestResponse'', Payload = json.dumps(event))
return True
Estaba buscando cortar SNS hasta que vi esto en los documentos del cliente Lambda (versión 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 finalice la llamada de servicio.
Entonces, SNS tiene una ventaja obvia: es asíncrono. Su lambda no esperará a que se complete la posterior lambda.
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.
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.
Puede configurar 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();
Puede invocar la función lambda directamente (al menos a través de Java) utilizando
AWSLambdaClient
como se describe en la publicación del blog de AWS.
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/
Una especie de 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