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

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

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

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

здесь пример кода для 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, вам также нужно добавить такую ​​же политику в свою роль лямбда

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

  • чтобы получить цитату
  • превращает цитату в заказ

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

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

InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest); 

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

Ответ 11

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

Ответ 12

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

Я делаю БД вызывать функцию 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/

Ответ 13

Вид решения с круговым движением, но я просто называю конечную точку 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

Ответ 14

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

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

Ответ 15

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