Uma function do AWS Lambda pode chamar outra

Eu tenho 2 funções Lambda – uma que produz uma cotação e uma que transforma uma cotação em uma ordem. Gostaria que a function Order lambda chamasse a function Quote para regenerar a cotação, em vez de apenas recebê-la de um cliente não confiável.

Eu olhei em todos os lugares que eu posso pensar – mas não consigo ver como eu iria sobre encadear ou chamar as funções … certamente isso existe!

Eu encontrei um caminho usando o 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) } }); 

Você pode encontrar o documento aqui: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

Você deve encadear suas Lambda functions via SNS . Essa abordagem fornece bom desempenho, latência e escalabilidade para um esforço mínimo.

Seu primeiro Lambda publica mensagens no seu SNS Topic e o segundo Lambda está inscrito neste tópico. Assim que as mensagens chegam no tópico, o segundo Lambda é executado com a mensagem como parâmetro de input.

Consulte Chamando funções do Lambda usando as notifications do Amazon SNS .

Você também pode usar essa abordagem para invocar funções Lambda de várias contas por meio do SNS .

aqui está um exemplo de código 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) 

Btw, você precisaria adicionar uma política como esta para o seu papel lambda bem

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

Eu estava olhando para cortar SNS até que eu vi isso nos docs do cliente Lambda (versão Java) :

Cliente para acessar o AWS Lambda. Todas as chamadas de serviço feitas usando este cliente estão bloqueando e não retornarão até que a chamada de serviço seja concluída.

Então, o SNS tem uma vantagem óbvia: é asynchronous. Seu lambda não esperará que o lambda subseqüente seja concluído.

Desde que esta pergunta foi feita, a Amazon lançou o Step Functions ( https://aws.amazon.com/step-functions/ ).

Um dos principais princípios por trás do AWS Lambda é que você pode se concentrar mais na lógica de negócios e menos na lógica de aplicação que une tudo. As funções de etapa permitem orquestrar interações complexas entre funções sem precisar escrever o código para fazer isso.

Eu estava trabalhando com a resposta fornecida pelo blueskin mas não consegui ler a resposta do Payload porque o InvocationType = ‘Event’ é asynchronous , então eu mudei como InvocationType = ‘RequestResponse’ e agora tudo funciona bem.

Você pode usar o recurso Cascata Async.js – veja a parte inferior do grande pedaço de código na Etapa 3 deste documento para um exemplo:

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

Em java, podemos fazer o seguinte:

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

Aqui, payload é seu object java stringificado, que precisa ser passado como object Json para outro lambda, caso você precise passar algumas informações de call lambda para lambda.

Estou tendo o mesmo problema, mas a function Lambda que eu implemento inserirá uma input no DynamoDB, portanto, minha solução usa os Triggers do DynamoDB.

Eu faço o DB chamar uma function do Lambda para cada inserção / atualização na tabela, então isso separa a implementação de duas funções do Lambda.

A documentação está aqui: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html

Aqui está uma explicação guiada: https://aws.amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/

Tipo de uma solução de rotunda, mas eu apenas chamo o endpoint da API para minhas funções lambda quando preciso encadeá-las. Isso permite que você decida enquanto codifica se deseja que eles sejam asynchronouss ou não.

Caso você não queira configurar uma solicitação POST, basta configurar uma solicitação GET simples com alguns ou nenhum parâmetro de string de consulta para facilitar a passagem de events.

– Editar –

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

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

Você pode invocar a function lambda diretamente (pelo menos via Java) usando o AWSLambdaClient conforme descrito na publicação do blog da AWS.

Você pode definir o ambiente 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();