Aufrufen einer Lambda-Funktion mit einer nativen Aurora MySQL-Funktion - Amazon Aurora

Aufrufen einer Lambda-Funktion mit einer nativen Aurora MySQL-Funktion

Anmerkung

Sie können die nativen Funktionen lambda_sync und lambda_async aufrufen, wenn Sie Aurora MySQL Version 2 oder Aurora MySQL Version 3.01 und höher verwenden. Weitere Informationen zu den Aurora MySQL-Versionen erhalten Sie unter Datenbank-Engine-Updates für Amazon Aurora MySQL.

Sie können eine AWS Lambda-Funktion in einem Aurora-MySQL-DB-Cluster durch den Aufruf der nativen Funktionen lambda_sync und lambda_async aufrufen. Dieser Ansatz kann hilfreich sein, wenn Sie Ihre Datenbank in Aurora MySQL in andere AWS-Services integrieren möchten. Beispielsweise soll jedes Mal, wenn eine Zeile in eine bestimmte Tabelle der Datenbank eingefügt wird, eine Benachrichtigung mit Amazon Simple Notification Service (Amazon SNS) gesendet werden.

Arbeiten mit nativen Funktionen zum Aufrufen einer Lambda-Funktion

Die Funktionen lambda_sync und lambda_async sind eingebaute, native Funktionen, die eine Lambda-Funktion synchron oder asynchron aufrufen. Wenn Sie das Ergebnis der Ausführung der aufgerufenen Lambda-Funktion kennen müssen, bevor Sie zu einer anderen Aktion übergehen, verwenden Sie die synchrone Funktion lambda_sync. Wenn Sie das Ergebnis der Ausführung der aufgerufenen Lambda-Funktion nicht kennen müssen, bevor Sie zu einer anderen Aktion übergehen, verwenden Sie die asynchrone Funktion lambda_async.

Gewähren der Rolle in Aurora MySQL Version 3

In Aurora MySQL Version 3 muss dem Benutzer, der eine native Funktion aufruft, die AWS_LAMBDA_ACCESS-Rolle gewährt werden. Um einem Benutzer diese Rolle zuzuweisen, stellen Sie als Administrator eine Verbindung zur DB-Instance her und führen Sie die folgende Anweisung aus.

GRANT AWS_LAMBDA_ACCESS TO user@domain-or-ip-address

Sie können diese Rolle widerrufen, indem Sie die folgende Anweisung ausführen.

REVOKE AWS_LAMBDA_ACCESS FROM user@domain-or-ip-address
Tipp

Wenn Sie die Rollentechnik in Aurora MySQL Version 3 verwenden, können Sie die Rolle auch mit der Anweisung SET ROLE role_name oder SET ROLE ALL aktivieren. Wenn Sie mit dem MySQL 8.0-Rollensystem nicht vertraut sind, finden Sie in Rollenbasiertes Berechtigungsmodell weitere Informationen. Weitere Informationen finden Sie unter Verwenden von Rollen im MySQL-Referenzhandbuch.

Dies gilt nur für die aktuelle aktive Sitzung. Wenn Sie sich wieder verbinden, müssen Sie die SET ROLE-Anweisung noch einmal ausführen, um Berechtigungen zu gewähren. Weitere Informationen finden Sie unter SET ROLE-Anweisung im MySQL-Referenzhandbuch.

Sie können den DB-Cluster-Parameter activate_all_roles_on_login zum automatischen Aktivieren aller Rollen verwenden, wenn ein Benutzer eine Verbindung mit einer DB-Instance herstellt. Wenn dieser Parameter festgelegt ist, müssen Sie die SET ROLE-Anweisung in der Regel nicht explizit aufrufen, um eine Rolle zu aktivieren. Weitere Informationen finden Sie unter activate_all_roles_on_login im MySQL-Referenzhandbuch.

Sie müssen jedoch SET ROLE ALL zu Beginn einer gespeicherten Prozedur explizit aufrufen, um die Rolle zu aktivieren, wenn die gespeicherte Prozedur von einem anderen Benutzer aufgerufen wird.

Wenn Sie beim Versuch, eine Lambda-Funktion aufzurufen, eine Fehlermeldung wie die folgende erhalten, führen Sie eine SET ROLE-Anweisung aus.

SQL Error [1227] [42000]: Access denied; you need (at least one of) the Invoke Lambda privilege(s) for this operation

Stellen Sie sicher, dass Sie die Rolle dem richtigen Benutzer erteilen, wie in den mysql.users-Tabelleneinträgen gezeigt. Möglicherweise gibt es mehrere Benutzer mit demselben Namen, aber auf unterschiedlichen Hosts. Je nachdem, welche Anwendung oder welcher Host die Funktion lambda_sync aufruft, wählt MySQL anhand der host-Spalteneinträge den Benutzer mit der besten Übereinstimmung aus.

Gewähren der Berechtigung in Aurora MySQL Version 2

In Aurora MySQL Version 2 muss dem Benutzer, der eine native Funktion aufruft, die INVOKE LAMBDA-Berechtigung gewährt werden. Um einem Benutzer diese Berechtigung zu erteilen, stellen Sie als Administrator eine Verbindung zur DB-Instance her und führen Sie die folgende Anweisung aus.

GRANT INVOKE LAMBDA ON *.* TO user@domain-or-ip-address

Sie können das Recht für einen anderen Benutzer mithilfe der folgenden Anweisung erteilen.

REVOKE INVOKE LAMBDA ON *.* FROM user@domain-or-ip-address

Syntax für die lambda_sync-Funktion

Sie rufen die Funktion lambda_sync synchron zum Aufruftyp RequestResponse auf. Die Funktion gibt das Ergebnis des Aufrufs von Lambda in einer JSON-Nutzlast zurück. Die Funktion weist die folgende Syntax auf.

lambda_sync ( lambda_function_ARN, JSON_payload )

Parameter für die lambda_sync-Funktion

Die Funktion lambda_sync hat die folgenden Parameter.

lambda_function_ARN

Der Amazon-Ressourcenname (ARN) der aufzurufenden Lambda-Funktion.

JSON-Nutzlast

Die Nutzlast für die aufgerufene Lambda-Funktion im JSON-Format.

Anmerkung

Aurora MySQL Version 3 unterstützt die JSON-Parsingfunktionen von MySQL 8.0. Aurora MySQL-Version 2 enthält diese Funktionen jedoch nicht. JSON-Parsing ist nicht erforderlich, wenn eine Lambda-Funktion einen atomaren Wert zurückgibt, wie z. B. eine Zahl oder einen String.

Beispiel für die lambda_sync-Funktion

Die folgende Abfrage, die auf lambda_sync basiert, ruft die Lambda-Funktion BasicTestLambda synchron mithilfe der ARN-Funktion auf. Die Nutzlast für die Funktion ist {"operation": "ping"}.

SELECT lambda_sync( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}');

Syntax für die lambda_async-Funktion

Sie rufen die Funktion lambda_async asynchron zum Aufruftyp Event auf. Die Funktion gibt das Ergebnis des Aufrufs von Lambda in einer JSON-Nutzlast zurück. Die Funktion weist die folgende Syntax auf.

lambda_async ( lambda_function_ARN, JSON_payload )

Parameter für die lambda_async-Funktion

Die Funktion lambda_async hat die folgenden Parameter.

lambda_function_ARN

Der Amazon-Ressourcenname (ARN) der aufzurufenden Lambda-Funktion.

JSON-Nutzlast

Die Nutzlast für die aufgerufene Lambda-Funktion im JSON-Format.

Anmerkung

Aurora MySQL Version 3 unterstützt die JSON-Parsingfunktionen von MySQL 8.0. Aurora MySQL-Version 2 enthält diese Funktionen jedoch nicht. JSON-Parsing ist nicht erforderlich, wenn eine Lambda-Funktion einen atomaren Wert zurückgibt, wie z. B. eine Zahl oder einen String.

Beispiel für die lambda_async-Funktion

Die folgende Abfrage, die auf lambda_async basiert, ruft die Lambda-Funktion BasicTestLambda asynchron mithilfe der ARN-Funktion auf. Die Nutzlast für die Funktion ist {"operation": "ping"}.

SELECT lambda_async( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}');

Aufrufen einer Lambda-Funktion innerhalb eines Auslösers

Sie können Auslöser verwenden, um Lambda für datenmodifizierende Anweisungen aufzurufen. Das folgende Beispiel verwendet die native lambda_async-Funktion und speichert das Ergebnis in einer Variablen.

mysql>SET @result=0; mysql>DELIMITER // mysql>CREATE TRIGGER myFirstTrigger AFTER INSERT ON Test_trigger FOR EACH ROW BEGIN SELECT lambda_async( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}') INTO @result; END; // mysql>DELIMITER ;
Anmerkung

Auslöser werden nicht einmal pro SQL-Anweisung ausgeführt, sondern einmal pro geänderter Zeile, jeweils für eine einzelne Zeile. Wenn ein Trigger ausgeführt wird, ist der Prozess synchron. Die datenmodifizierende Anweisung wird nur zurückgegeben, wenn der Trigger abgeschlossen ist.

Seien Sie vorsichtig, wenn Sie eine AWS Lambda-Funktion aus Auslösern in Tabellen aufrufen, die einen hohen Schreibdatenverkehr aufweisen. Die Auslöser INSERT, UPDATE und DELETE werden pro Zeile aktiviert. Ein Workload mit hohem Schreibdatenverkehr in einer Tabelle mit den Auslösern INSERT, UPDATE oder DELETE führt zu einer hohen Anzahl von Aufrufen Ihrer AWS Lambda-Funktion.