Eu tenho 2 funções Lambda - uma que produz uma cotação e outra que transforma uma cotação em um pedido. Gostaria que a função lambda Order chame a função Quote para gerar novamente a cotação, em vez de apenas recebê-la de um cliente não confiável.
Eu procurei em todos os lugares em que consigo pensar - mas não consigo ver como eu encadear ou chamar as funções ... certamente isso existe!
Respostas:
Eu encontrei uma maneira de usar o
aws-sdk
.Você pode encontrar o documento aqui: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
fonte
InvocationType: 'Event'
parâmetro (adicione depoisFunctionName
ePayload
). Na documentação: "Você pode solicitar opcionalmente a execução assíncrona, especificando Event como o InvocationType". Com a execução assíncrona, a função de retorno de chamada será chamada de forma confiável, mas sem ter que esperar que o lambda chamado conclua a execução.AWSLambdaRole
. Ou você pode adicionar o seguinte objeto de instrução à diretiva existente da sua função: '{"Effect": "Allow", "Action": ["lambda: InvokeFunction"], "Resource": ["*"]} `Você deve encadear sua
Lambda functions
viaSNS
. Essa abordagem fornece bom desempenho, latência e escalabilidade para um esforço mínimo.O seu primeiro
Lambda
publica mensagens para o seuSNS Topic
e o segundoLambda
está inscrito neste tópico. Assim que as mensagens chegam ao tópico, o segundoLambda
é executado com a mensagem, como parâmetro de entrada.Consulte Chamando funções do Lambda usando notificações do Amazon SNS .
Você também pode usar essa abordagem para invocar funções Lambda entre contas via SNS .
fonte
aqui está um código de exemplo para python,
Aliás, você também precisará adicionar uma política como essa à sua função lambda
fonte
datetime.now()
em uma string (ou manipulá-la de alguma forma). Caso contrário, você obter o errodatetime.datetime(2017, 9, 11, 14, 40, 53, 23834) is not JSON serializable
InvocationType
deve ser:RequestResponse
. Para obter a resposta do lambda que você está tentando chamar.Desde que essa pergunta foi feita, a Amazon lançou as Step Functions ( https://aws.amazon.com/step-functions/ ).
Um dos princípios fundamentais por trás do AWS Lambda é que você pode se concentrar mais na lógica de negócios e menos na lógica do aplicativo que une tudo isso. As funções de etapa permitem orquestrar interações complexas entre funções sem precisar escrever o código para fazê-lo.
fonte
Esta solução é feita usando boto3 e Python:
fonte
Eu estava pensando em cortar o SNS até ver isso nos documentos do cliente Lambda (versão Java) :
Portanto, o SNS tem uma vantagem óbvia: é assíncrono. Seu lambda não esperará a conclusão do lambda subsequente.
fonte
A Amazon introduziu funções de etapas no AWS lambda em 2016. Acho que agora é mais conveniente usar a função de etapas, pois é muito fácil usá-las. Você pode construir uma máquina de estado com duas funções lambda como:
Você pode fazer isso facilmente como abaixo:
Aqui você pode ter o primeiro estado para produz uma cotação e outro para se transformar em ordem
As funções de etapas facilitam a gravação de várias funções lambda e a execução em sequência ou em paralelo. Você pode obter mais informações sobre as funções das etapas lambda aqui: Funções das etapas
fonte
Eu estava trabalhando com a resposta fornecida pelo blueskin, mas não consegui ler a resposta da Carga útil, porque o InvocationType = 'Event' é assíncrono , então mudei como InvocationType = 'RequestResponse' e agora tudo funciona bem.
fonte
Em java, podemos fazer o seguinte:
Aqui, a carga útil é seu objeto java com string que precisa ser passado como objeto Json para outro lambda, caso você precise passar algumas informações da chamada lambda para a chamada lambda.
fonte
Você pode usar o recurso Async.js Waterfall - veja a parte inferior do grande bloco de código na Etapa 3 deste documento para obter um exemplo:
https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/
fonte
Você pode invocar a função lambda diretamente (pelo menos via Java) usando
AWSLambdaClient
conforme descrito na postagem do blog da AWS .fonte
Estou tendo o mesmo problema, mas a função Lambda que eu implemento insere uma entrada no DynamoDB, então minha solução usa os gatilhos do DynamoDB.
Eu faço o banco de dados invocar uma função Lambda para cada inserção / atualização na tabela, portanto, 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á uma explicação guiada: https://aws.amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/
fonte
Tipo de solução rotatória, mas eu apenas chamo o ponto de extremidade da API para minhas funções lambda quando preciso encadeá-las. Isso permite que você decida durante a codificação se deseja que eles sejam assíncronos 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 eventos.
- Editar -
Consulte: 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
fonte
Outros apontaram para usar SQS e Step Functions. Mas essas duas soluções adicionam custos adicionais. As transições de estado da função Step são supostamente muito caras.
O AWS lambda oferece alguma lógica de nova tentativa. Onde tenta algo por 3 vezes. Não tenho certeza se isso ainda é válido quando você o aciona usando a API.
fonte
Aqui está o exemplo python de chamar outra função lambda e obtém sua resposta. Existem dois tipos de chamada 'RequestResponse' e 'Event' . Use 'RequestResponse' se desejar obter a resposta da função lambda e use 'Event' para chamar a função lambda de forma assíncrona. Portanto, os dois modos assíncrono e síncrono estão disponíveis.
fonte
Você pode definir o ambiente AWS_REGION.
fonte