Uma função Lambda AWS pode chamar outra

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

Procurei por todo o lado, mas não vejo como é que eu iria acorrentar ou ligar para as funções...certamente que isto existe!

Author: Hank D, 2015-07-30

13 answers

Encontrei uma maneira de usar 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)
  }
});

Pode encontrar o Doutor aqui: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

 242
Author: Nicolas Grenié, 2015-07-31 12:05:17

Devias acorrentar o teu {[[0]} por SNS. Esta abordagem proporciona um bom desempenho, latência e escalabilidade para um esforço mínimo.

O seu primeiro Lambda publica mensagens para o seu SNS Topic e o segundo Lambda subscreve este tópico. Assim que as mensagens chegam ao tópico, o segundo Lambda é executado com a mensagem como parâmetro de entrada.

Ver invocar as funções Lambda usando as notificações do Amazon SNS .

Também pode usar esta abordagem para invoque funções Lambda de contas cruzadas via SNS .

 73
Author: kixorz, 2016-07-04 03:00:24

Aqui está um código de exemplo 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ê teria que adicionar uma política como esta para o seu papel lambda também

   {
        "Sid": "Stmt1234567890",
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Resource": "*"
    }
 45
Author: blueskin, 2017-03-28 18:13:21
Eu estava a olhar para cortar o SNS até ver isto no Docs do cliente Lambda (versão Java).):
Cliente para aceder à AWS Lambda. Todas as chamadas de serviço feitas usando este cliente estão bloqueando, e não retornará até que a chamada de serviço completa.
Então o SNS tem uma vantagem óbvia: é assíncrono. A vossa lambda não vai esperar que a lambda seguinte termine.
 9
Author: Ben Iggulden, 2016-08-09 03:12:02

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

Um dos princípios fundamentais por trás da 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. Funções Step permite que você orquestre interações complexas entre funções sem ter que escrever o código para fazê-lo.
 8
Author: dustinnoe, 2018-01-15 13:28:20

Eu estava trabalhando com a resposta dada por blueskin, mas eu não podia ler a Carga de resposta, porque a InvocationType='Evento' é assíncrono, então eu mudei como InvocationType='RequestResponse' e agora tudo funciona bem.

 4
Author: antonio, 2016-03-31 23:42:58
Talvez possas fazer uso do Async.recurso da Cascata js-veja a parte inferior do bloco de código Grande no Passo 3 deste documento para um exemplo:

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

 2
Author: Mike, 2015-09-02 14:54:25

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, a carga útil é o seu objeto java que precisa ser passado como objeto Json para outro lambda no caso de você precisar passar alguma informação de ligar lambda para lambda chamado.

 2
Author: Suyash, 2017-09-06 12:27:23

Estou a ter o mesmo problema, mas a função Lambda que implementei irá inserir uma entrada no DynamoDB, por isso a minha solução usa gatilhos do DynamoDB.

Eu faço o DB invocar uma função Lambda para cada inserção / atualização na tabela, de modo que isso separa a implementação de duas funções Lambda.

A documentação está aqui.: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html Aqui está um guia passo: https://aws.amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/
 1
Author: Lewen, 2016-04-22 08:59:05

É uma espécie de solução rotativa, mas eu chamo apenas o ponto final da API para as minhas funções lambda quando preciso acorrentá-las. Isto permite-lhe decidir enquanto codifica se deseja que sejam assíncronos ou não.

No caso de não querer configurar um pedido de publicação, pode simplesmente configurar um pedido de obtenção simples com um par, ou nenhum, parâmetros de pesquisa string para a passagem fácil de eventos.

-- Editar --

Ver: 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

 1
Author: Anselm, 2017-08-03 15:54:38

Você pode invocar a função lambda directamente (pelo menos através de Java) usando AWSLambdaClient como descrito no blog da AWS post.

 0
Author: Neil, 2016-03-21 04:30:27

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();
 0
Author: hojin, 2017-09-26 06:54:59
A Amazon introduziu funções steps na AWS lambda em 2016. Eu acho, agora é mais conveniente usar a função steps como é realmente fácil de usá-los. Você pode construir uma máquina estatal com duas funções lambda como:
  • para produzir uma citação
  • transforma uma citação numa ordem

Você pode facilmente fazer isso como abaixo:

Aqui você pode ter o primeiro estado para produzir uma citação e outro para se transformar em ordem

{
  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
    }
  }
}

As funções dos passos fazem é muito fácil escrever múltiplas funções lambda e executar em sequência ou em paralelo. Você pode obter mais informações sobre as funções lambda steps aqui: Steps Functions

 0
Author: Sunil Kapil, 2018-08-31 21:42:31