it-swarm.com.de

Kann eine AWS-Lambda-Funktion eine andere aufrufen

Ich habe 2 Lambda-Funktionen - eine, die ein Zitat erzeugt, und eine, die ein Zitat in eine Bestellung umwandelt. Ich möchte, dass die Funktion Lambda-Funktion die Zitat-Funktion zum Wiederherstellen des Zitats aufruft, statt sie nur von einem nicht vertrauenswürdigen zu erhalten Klient.

Ich habe überall nachgesehen, wo ich mir vorstellen kann - aber ich kann nicht sehen, wie ich die Funktionen verketten oder aufrufen würde ... sicherlich existiert das!

206
Silver

Ich habe einen Weg gefunden, den aws-sdk zu verwenden.

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)
  }
});

Sie finden das Dokument hier: http://docs.aws.Amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

267
Nicolas Grenié

Sie sollten Ihren Lambda functions über SNS verketten. Dieser Ansatz bietet eine gute Leistung, Latenz und Skalierbarkeit bei minimalem Aufwand.

Ihre erste Lambda veröffentlicht Nachrichten in Ihrem SNS Topic und die zweite Lambda ist für dieses Thema abonniert. Sobald Nachrichten im Thema ankommen, wird die zweite Lambda mit der Nachricht als Eingabeparameter ausgeführt.

Siehe Lambda-Funktionen mit Amazon SNS-Benachrichtigungen aufrufen .

Sie können diesen Ansatz auch verwenden, um Cross-Account-Lambda-Funktionen über SNS aufzurufen.

81
kixorz

hier ist ein Beispielcode für 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)

Übrigens müssten Sie Ihrer Lambda-Rolle auch eine solche Richtlinie hinzufügen

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

Seitdem diese Frage gestellt wurde, hat Amazon Step Functions ( https://aws.Amazon.com/step-functions/ ) veröffentlicht. 

Eines der Kernprinzipien von AWS Lambda besteht darin, dass Sie sich mehr auf die Geschäftslogik und weniger auf die Anwendungslogik konzentrieren können, die alles miteinander verbindet. Mit Step-Funktionen können Sie komplexe Interaktionen zwischen Funktionen koordinieren, ohne dafür den Code schreiben zu müssen.

20
dustinnoe

Ich habe mir das Ausschneiden von SNS angesehen, bis ich dies in den Lambda-Client-Dokumenten (Java-Version) sah:

Client für den Zugriff auf AWS Lambda. Alle mit diesem Client durchgeführten Serviceanrufe blockieren und werden nicht zurückgegeben, bis der Serviceanruf abgeschlossen ist.

SNS hat also einen offensichtlichen Vorteil: Es ist asynchron. Ihr Lambda wird nicht warten, bis das nachfolgende Lambda abgeschlossen ist.

9
Ben Iggulden

Ich arbeitete mit der Antwort, die von blueskin geliefert wurde, konnte jedoch die Payload-Antwort nicht lesen, da InvocationType = 'Event'async ist, also habe ich mich als InvocationType geändert = 'RequestResponse' und jetzt funktioniert alles gut.

4
antonio

Amazon hat im Jahr 2016 Step-Funktionen in AWS Lambda eingeführt. Ich denke, es ist jetzt bequemer, die Step-Funktion zu verwenden, da es sehr einfach ist, sie zu verwenden. Sie können eine Zustandsmaschine mit zwei Lambda-Funktionen erstellen als:

  • ein Angebot erstellen
  • verwandelt ein Zitat in eine Bestellung

Sie können das einfach wie folgt tun: 

Hier können Sie den ersten Status für ein Angebot und einen weiteren für die Reihenfolge verwenden.

{
  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-Funktionen machen es sehr einfach, mehrere Lambda-Funktionen zu schreiben und nacheinander oder parallel auszuführen ..__ Weitere Informationen zu Lambda-Step-Funktionen finden Sie hier: Steps Functions

3
Sunil Kapil

In Java können wir Folgendes tun:

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

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

InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest); 

Payload ist hier Ihr stringified Java-Objekt, das als Json-Objekt an ein anderes Lambda übergeben werden muss, falls Sie Informationen vom aufrufenden Lambda an das gerufene Lambda übergeben müssen.

2
Suyash

Möglicherweise können Sie die Wasserfall-Funktion von Async.js verwenden - ein Beispiel finden Sie im unteren Teil des großen Codeabschnitts in Schritt 3 dieses Dokuments: 

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

2
Mike

Eine Art Rundumlösung, aber ich rufe einfach den API-Endpunkt für meine Lambda-Funktionen an, wenn ich sie verketten muss. Auf diese Weise können Sie während der Codierung entscheiden, ob sie asynchron sein sollen oder nicht.

Wenn Sie keine POST - Anforderung einrichten möchten, können Sie einfach eine einfache GET-Anforderung mit ein paar oder überhaupt keine Abfragezeichenfolgeparameter einrichten, um die Ereignisübergabe zu erleichtern. 

- Bearbeiten -

Siehe: https://docs.aws.Amazon.com/apigateway/api-reference/making-http-requests/

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

1
Anselm

Sie können die Lambda-Funktion direkt (zumindest über Java) aufrufen, indem Sie AWSLambdaClient verwenden, wie im AWS-Blog post beschrieben. 

1
Neil

Diese Lösung wird mit boto3 und Python ausgeführt:

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

Ich habe das gleiche Problem, aber die Lambda-Funktion, die ich implementiere, fügt einen Eintrag in DynamoDB ein. Daher verwendet meine Lösung DynamoDB-Trigger.

Ich lasse die DB für jedes Einfügen/Aktualisieren in der Tabelle eine Lambda-Funktion aufrufen, sodass die Implementierung von zwei Lambda-Funktionen getrennt wird.

Die Dokumentation ist hier: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html

Hier finden Sie eine ausführliche Anleitung: https://aws.Amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/

1
Lewen

Sie können die AWS_REGION-Umgebung festlegen.

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