Puede una función AWS Lambda llamar a otra


Tengo 2 funciones Lambda - una que produce una cita y otra que convierte una cita en un orden. Me gustaría que la función Order lambda llame a la función Quote para regenerar la cotización, en lugar de solo recibirla de un cliente no confiable.

He buscado por todas partes que se me ocurre, pero no puedo ver cómo encadenar o llamar a las funciones...¡seguro que esto existe!

Author: Hank D, 2015-07-30

13 answers

Encontré una manera usando 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

 242
Author: Nicolas Grenié,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-31 12:05:17

Usted debe encadenar su Lambda functions vía SNS. Este enfoque proporciona un buen rendimiento, latencia y escalabilidad para un esfuerzo mínimo.

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

Consulte Invocación de funciones Lambda mediante notificaciones de Amazon SNS.

También puede usar este enfoque para Invocar funciones de Lambda entre cuentas a través de SNS.

 73
Author: kixorz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-04 03:00:24

Aquí hay un código de ejemplo 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 tendría que agregar una política como esta a su rol lambda

   {
        "Sid": "Stmt1234567890",
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Resource": "*"
    }
 45
Author: blueskin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-28 18:13:21

Estaba buscando recortar 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 se complete la llamada de servicio.

Así que el SNS tiene una ventaja obvia: es asíncrono. Tu lambda no esperará a que se complete la lambda posterior.

 9
Author: Ben Iggulden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 03:12:02

Desde que se hizo esta pregunta, Amazon ha lanzado Funciones de paso ( 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 vincula todo. Step functions le permite orquestar interacciones complejas entre funciones sin tener que escribir el código para hacerlo.

 8
Author: dustinnoe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-15 13:28:20

Estaba trabajando con la respuesta proporcionada por blueskin pero no pude leer la respuesta de carga porque el InvocationType='Event' es async, así que cambié como InvocationType='RequestResponse' y ahora todo funciona bien.

 4
Author: antonio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-31 23:42:58

Es posible que pueda hacer uso de la Async.función Cascada js-vea 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 /

 2
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-02 14:54:25

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í, payload es su objeto java stringified que necesita ser pasado como objeto Json a otro lambda en caso de que necesite pasar alguna información de llamar a lambda a lambda.

 2
Author: Suyash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-06 12:27:23

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

Hago que la base de datos 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 una guía tutorial: https://aws.amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/

 1
Author: Lewen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-22 08:59:05

Una especie de solución rotonda, pero solo llamo al API endpoint para mis funciones lambda cuando necesito encadenarlas. Esto le permite decidir al codificar 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 de parámetros de cadena de consulta, o ninguno, para facilitar el paso de eventos.

-- Editar --

Véase: 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

 1
Author: Anselm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-03 15:54:38

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

 0
Author: Neil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-21 04:30:27

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();
 0
Author: hojin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-26 06:54:59

Amazon introdujo las funciones steps 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 cita
  • convierte una cita en un orden

Puedes hacerlo fácilmente de la siguiente manera:

Aquí puede tener el primer estado para produce una cita y otro para se convierte 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
    }
  }
}

Pasos funciones lo hace realmente fácil escribir múltiples funciones lambda y ejecutarlas en secuencia o en paralelo. Puede obtener más información sobre las funciones de lambda steps aquí: Pasos Funciones

 0
Author: Sunil Kapil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-31 21:42:31