it-swarm.com.ru

Может ли лямбда-функция AWS вызвать другую

У меня есть 2 лямбда-функции - одна, которая генерирует кавычку, и другая, которая превращает кавычку в заказ Я бы хотел, чтобы лямбда-функция Order вызывала функцию Quote для генерации кавычки, а не просто получала ее от ненадежного клиент.

Я искал повсюду, что только мог придумать, но не представляю, как бы я работал с цепочкой или вызывал функции ... конечно, это существует!

206
Silver

Я нашел способ, используя 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)
  }
});

Вы можете найти документ здесь: http://docs.aws.Amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

267
Nicolas Grenié

Вы должны связать свой Lambda functions через SNS. Такой подход обеспечивает хорошую производительность, задержку и масштабируемость при минимальных усилиях.

Ваша первая Lambda публикует сообщения для вашего SNS Topic, а вторая Lambda подписывается на эту тему. Как только в тему поступают сообщения, запускается вторая Lambda с сообщением в качестве входного параметра.

См. Вызов лямбда-функций с помощью уведомлений Amazon SNS .

Вы также можете использовать этот подход для вызова лямбда-функций кросс-счета через SNS .

81
kixorz

вот пример кода для 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)

Кстати, вам нужно будет добавить такую ​​политику в вашу лямбда-роль

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

Поскольку этот вопрос был задан, Amazon выпустила пошаговые функции ( https://aws.Amazon.com/step-functions/ ). 

Одним из основных принципов AWS Lambda является то, что вы можете больше сосредоточиться на бизнес-логике, а не на логике приложения, которая связывает все это вместе. Шаговые функции позволяют организовать сложные взаимодействия между функциями без необходимости написания кода для этого.

20
dustinnoe

Я смотрел на вырезание SNS, пока не увидел это в Lambda client docs (Java версия) :

Клиент для доступа к AWS Lambda. Все сервисные вызовы, сделанные с помощью этого клиента, блокируются и не возвращаются, пока сервисный вызов не завершится.

Так что у SNS есть очевидное преимущество: он асинхронный. Ваша лямбда не будет ждать окончания следующей лямбды.

9
Ben Iggulden

Я работал с ответом, предоставленным blueskin , но я не мог прочитать ответ полезной нагрузки, потому что InvocationType = 'Event' is async , поэтому я изменил на InvocationType = 'RequestResponse' и теперь все работает хорошо.

4
antonio

Amazon представила функции шага в AWS lambda в 2016 году. Думаю, теперь удобнее использовать функцию шага, поскольку их действительно легко использовать. Вы можете построить конечный автомат с двумя лямбда-функциями:

  • производить цитату
  • превращает цитату в заказ

Вы можете легко сделать это, как показано ниже: 

Здесь у вас может быть первое состояние для создания цитаты, а другое - для преобразования в порядок

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

Ступенчатые функции позволяют действительно легко написать несколько лямбда-функций и запускать их последовательно или параллельно . Подробнее о пошаговых функциях лямбды можно узнать здесь: Ступенчатые функции

3
Sunil Kapil

В Java мы можем сделать следующее:

AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build();

InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload);

InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest); 

Здесь полезной нагрузкой является ваш stringified Java-объект, который необходимо передать как Json-объект другой лямбде, если вам нужно передать некоторую информацию от вызова лямбды к вызываемой лямбде.

2
Suyash

Возможно, вы сможете использовать функцию водопада Async.js - см. Пример нижней части большого фрагмента кода в шаге 3 этого документа: 

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

2
Mike

Что-то вроде обходного решения, но я просто вызываю конечную точку API для своих лямбда-функций, когда мне нужно их связать. Это позволяет вам при кодировании решить, хотите ли вы, чтобы они были асинхронными или нет.

Если вы не хотите настраивать запрос POST, вы можете просто настроить простой запрос GET с парой или вообще без параметров строки запроса для простой передачи события. 

-- Редактировать --

Смотрите: https://docs.aws.Amazon.com/apigateway/api-reference/making-http-requests/

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

1
Anselm

Вы можете вызвать лямбда-функцию напрямую (по крайней мере через Java), используя AWSLambdaClient, как описано в блоге AWS post

1
Neil

Это решение сделано с использованием boto3 и 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
1
Trilok Nagvenkar

У меня та же проблема, но реализованная мной функция Lambda вставит запись в DynamoDB, поэтому мое решение использует триггеры DynamoDB.

Я заставляю БД вызывать функцию Lambda для каждой вставки/обновления в таблице, так что это разделяет реализацию двух функций Lambda.

Документация находится здесь: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html

Вот пошаговое руководство: https://aws.Amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/

1
Lewen

Вы можете установить среду 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
hojin