Chiamare una funzione Lambda da un cluster DB Amazon Aurora MySQL - Amazon Aurora

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Chiamare una funzione Lambda da un cluster DB Amazon Aurora MySQL

Puoi richiamare una AWS Lambda funzione da un cluster Edition DB compatibile con Amazon Aurora MySQL con la funzione nativa oppure. lambda_sync lambda_async Prima di chiamare una funzione Lambda da Aurora MySQL, il un cluster DB Aurora deve avere l'accesso a Lambda. Per dettagli sulla concessione dell'accesso ad Aurora MySQL, consultare Accesso di Aurora a Lambda;. Per informazioni sulla lambda_sync e su funzioni archiviate lambda_async, consultare Chiamare una funzione Lambda con una funzione nativa Aurora MySQL.

Puoi anche richiamare una AWS Lambda funzione utilizzando una procedura memorizzata. Tuttavia, l'utilizzo di una procedura archiviate è obsoleto. Ti consigliamo vivamente di usare una funzione nativa Aurora MySQL se utilizzi una delle seguenti versioni di Aurora MySQL:

  • Aurora MySQL versione 2, per cluster compatibili con MySQL 5.7.

  • Aurora MySQL versione 3.01 e successive, per cluster compatibili con MySQL 8.0. La stored procedure non è disponibile in Aurora MySQL versione 3.

Accesso di Aurora a Lambda;

Prima di poter chiamare le funzioni Lambda da un cluster database Aurora MySQL, assicurarsi innanzitutto di concedere l'autorizzazione al cluster per accedere a Lambda.

Per concedere ad Aurora MySQL l'accesso ad Lambda
  1. Crea una policy AWS Identity and Access Management (IAM) che fornisca le autorizzazioni che consentono al cluster Aurora MySQL DB di richiamare le funzioni Lambda. Per istruzioni, consulta Creazione di una policy IAM per l'accesso alle risorseAWS Lambda.

  2. Creare un ruolo IAM e collegare la policy IAM creata in Creazione di una policy IAM per l'accesso alle risorseAWS Lambda al nuovo ruolo IAM. Per istruzioni, consulta Creazione di un ruolo IAM per consentire ad Amazon Aurora di accedere ai servizi AWS.

  3. Impostare il parametro aws_default_lambda_role del cluster DB sull'Amazon Resource Name (ARN) del nuovo ruolo IAM.

    Se il cluster fa parte di un database globale Aurora, applica la stessa impostazione per ogni cluster Aurora nel database globale.

    Per ulteriori informazioni sui parametri del cluster DB, vedi Parametri dell'istanza database e del cluster database di Amazon Aurora.

  4. Per consentire di chiamare le funzioni Lambda agli utenti del database in un cluster DB Aurora MySQL, è necessario associare il ruolo creato in Creazione di un ruolo IAM per consentire ad Amazon Aurora di accedere ai servizi AWS con il cluster DB. Per informazioni su come associare un ruolo IAM a un cluster DB, vedi Associazione di un ruolo IAM a un cluster DB Amazon Aurora MySQL.

    Se il cluster fa parte di un database globale Aurora, associa il ruolo a ogni cluster Aurora nel database globale.

  5. Configura il cluster DB Aurora MySQL per consentire le connessioni in uscita ad Lambda. Per istruzioni, consulta Abilitazione delle comunicazioni di rete da Amazon Aurora MySQL ad altri servizi AWS.

    Se il cluster fa parte di un database globale Aurora, abilita le connessioni in uscita per ogni cluster Aurora nel database globale.

Chiamare una funzione Lambda con una funzione nativa Aurora MySQL

Nota

È possibile chiamare le funzioni native lambda_sync e lambda_async con Aurora MySQL versione 2 o Aurora MySQL versione 3.01 e versioni successive. Per ulteriori informazioni sulle versioni di Aurora MySQL, consulta Aggiornamenti del motore del database per Amazon Aurora MySQL.

È possibile richiamare una AWS Lambda funzione da un cluster Aurora MySQL DB chiamando le funzioni native e. lambda_sync lambda_async Questo approccio può essere utile quando si desidera integrare il database in esecuzione su Aurora MySQL con altri servizi. AWS Ad esempio, potresti voler inviare una notifica usando Amazon Simple Notification Service (Amazon SNS) ogni volta che una riga viene inserita in una tabella specifica nel database.

Utilizzo delle funzioni native per chiamare una funzione Lambda

Le funzioni lambda_sync e lambda_async sono funzioni native predefinite che chiamano una funzione Lambda in modo sincrono o asincrono. Quando è necessario conoscere il risultato dell'esecuzione della funzione Lambda prima di passare a un'altra operazione, utilizza la funzione sincrona lambda_sync. Quando non è necessario conoscere il risultato della funzione Lambda prima di passare a un'altra operazione, utilizza la funzione asincrona lambda_async.

Concessione del ruolo in Aurora MySQL versione 3

In Aurora MySQL versione 3, l'utente che invoca una funzione nativa deve avere il ruolo AWS_LAMBDA_ACCESS. Per concedere questo privilegio a un utente, connettersi all'istanza database come utente amministratore ed eseguire la seguente istruzione.

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

Si può revocare questo ruolo eseguendo la seguente istruzione.

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

Quando utilizzi la tecnica basata sul ruolo in Aurora MySQL versione 3, puoi anche attivare il ruolo utilizzando l'istruzione SET ROLE role_name o SET ROLE ALL. Se non si ha familiarità con il sistema dei ruoli MySQL 8.0, è possibile ottenere ulteriori informazioni in Privilegio basato sui ruoli. Per maggiori dettagli, consulta Using roles nel MySQL Reference Manual.

Questo vale solo per la sessione attiva corrente. Quando ci si riconnette, è necessario eseguire nuovamente l'SET ROLEistruzione per concedere i privilegi. Per ulteriori informazioni, consulta Istruzione SET ROLE nel Manuale di riferimento di MySQL.

Puoi utilizzare il parametro activate_all_roles_on_login del cluster di database per attivare automaticamente tutti i ruoli quando un utente si connette a un'istanza database. Quando questo parametro è impostato, in genere non è necessario chiamare l'SET ROLEistruzione in modo esplicito per attivare un ruolo. Per ulteriori informazioni, consulta activate_all_roles_on_login nel Manuale di riferimento di MySQL.

Tuttavia, è necessario chiamare SET ROLE ALL esplicitamente all'inizio di una stored procedure per attivare il ruolo, quando la stored procedure viene chiamata da un altro utente.

Se ricevi un errore come il seguente quando provi a richiamare una funzione Lambda, esegui un'istruzione SET ROLE.

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

Concessione del privilegio in Aurora MySQL versione 2

In Aurora MySQL versione 2, l'utente che richiama una funzione nativa deve avere il privilegio INVOKE LAMBDA. Per concedere questo privilegio a un utente, connettersi all'istanza database come utente amministratore ed eseguire la seguente istruzione.

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

Puoi revocare questo privilegio eseguendo la seguente istruzione.

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

Sintassi per la funzione lambda_sync

Invochi la funzione lambda_sync in modo sincrono con il tipo di chiamata RequestResponse. La funzione restituisce il risultato della chiamata Lambda in un payload JSON. La funzione ha la seguente sintassi.

lambda_sync ( lambda_function_ARN, JSON_payload )

Parametri per la funzione lambda_sync

La funzione lambda_sync include i seguenti parametri.

lambda_function_ARN

Amazon Resource Name (ARN) della funzione Lambda da chiamare.

JSON_payload

Il payload per la funzione Lambda chiamata in formato JSON.

Nota

Aurora MySQL versione 3 supporta le funzioni di analisi JSON di MySQL 8.0. Tuttavia, Aurora MySQL versione 2 non include queste funzioni. L'analisi JSON non è richiesta quando una funzione Lambda restituisce un valore atomico, come un numero o una stringa.

Esempio per la funzione lambda_sync

La seguente query basata su lambda_sync chiama la funzione Lambda BasicTestLambda in modo sincrono usando l'ARN della funzione. Il payload per la funzione è {"operation": "ping"}.

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

Sintassi per la funzione lambda_async

Invochi la funzione lambda_async in modo asincrono con il tipo di chiamata Event. La funzione restituisce il risultato della chiamata Lambda in un payload JSON. La funzione ha la seguente sintassi.

lambda_async ( lambda_function_ARN, JSON_payload )

Parametri per la funzione lambda_async

La funzione lambda_async include i seguenti parametri.

lambda_function_ARN

Amazon Resource Name (ARN) della funzione Lambda da chiamare.

JSON_payload

Il payload per la funzione Lambda chiamata in formato JSON.

Nota

Aurora MySQL versione 3 supporta le funzioni di analisi JSON di MySQL 8.0. Tuttavia, Aurora MySQL versione 2 non include queste funzioni. L'analisi JSON non è richiesta quando una funzione Lambda restituisce un valore atomico, come un numero o una stringa.

Esempio per la funzione lambda_async

La seguente query basata su lambda_async chiama la funzione Lambda BasicTestLambda in modo asincrono usando l'ARN della funzione. Il payload per la funzione è {"operation": "ping"}.

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

Invocazione di una funzione Lambda all'interno di un trigger

Puoi utilizzare i trigger per chiamare Lambda sulle istruzioni di modifica dei dati. L'esempio seguente illustra come utilizzare la funzione lambda_async nativa e memorizzare il risultato in una variabile.

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 ;
Nota

I trigger non vengono eseguiti una volta per istruzione SQL, ma una volta per riga modificata, una riga alla volta. Quando viene eseguito un trigger, il processo è sincrono. L'istruzione di modifica dei dati viene restituita solo al completamento del trigger.

Fai attenzione quando richiami una AWS Lambda funzione dai trigger su tabelle che presentano un traffico di scrittura elevato. INSERTUPDATE, e i DELETE trigger vengono attivati per riga. Un carico di lavoro che richiede molta scrittura su una tabella con INSERT o DELETE trigger genera un gran numero di chiamate alla funzione. UPDATE AWS Lambda

Chiamare una funzione Lambda con una procedura archiviata Aurora MySQL (obsoleto)

È possibile richiamare una AWS Lambda funzione da un cluster Aurora MySQL DB chiamando la procedura. mysql.lambda_async Questo approccio può essere utile quando si desidera integrare il database in esecuzione su Aurora MySQL con altri servizi. AWS Ad esempio, potresti voler inviare una notifica usando Amazon Simple Notification Service (Amazon SNS) ogni volta che una riga viene inserita in una tabella specifica nel database.

Considerazioni sulle versioni Aurora MySQL

In Aurora MySQL versione 2 puoi utilizzare il metodo delle funzioni native anziché queste stored procedure per richiamare una funzione Lambda. Per ulteriori informazioni sulle funzioni native, consulta Utilizzo delle funzioni native per chiamare una funzione Lambda.

In Aurora MySQL versione 2, la stored procedure mysql.lambda_async non è più supportata. Ti consigliamo di utilizzare le funzioni Lambda native.

In Aurora MySQL versione 3, la procedura archiviata non è disponibile.

Utilizzo della procedura mysql.lambda_async per chiamare una funzione Lambda (obsoleto)

La procedura mysql.lambda_async è una stored procedure predefinita che chiama una funzione Lambda in modo asincrono. Per utilizzare questa procedura, l'utente del database deve avere il privilegio EXECUTE sulla stored procedure mysql.lambda_async.

Sintassi

La procedura mysql.lambda_async ha la seguente sintassi.

CALL mysql.lambda_async ( lambda_function_ARN, lambda_function_input )

Parametri

La procedura mysql.lambda_async include i seguenti parametri.

lambda_function_ARN

Amazon Resource Name (ARN) della funzione Lambda da chiamare.

lambda_function_input

La stringa di input in formato JSON per chiamare la funzione Lambda.

Esempi

Come best practice, ti consigliamo di inserire le chiamate alla procedura mysql.lambda_async in una procedura archiviata che può essere richiamata da origini diverse come trigger o codice client. Questo approccio può evitare problemi di resistenza non corrispondente e rendere più semplice per richiamare le funzioni Lambda.

Nota

Fai attenzione quando richiami una AWS Lambda funzione dai trigger su tabelle che presentano un traffico di scrittura elevato. INSERTUPDATE, e i DELETE trigger vengono attivati per riga. Un carico di lavoro pesante in scrittura su una tabella con trigger INSERT, UPDATE e DELETE genera un numero elevato di chiamate alla funzione AWS Lambda .

Sebbene le chiamate alla procedura mysql.lambda_async siano asincrone, i trigger sono sincroni. Un'istruzione che genera un numero elevato di attivazioni di trigger non attende il completamento della chiamata alla funzione AWS Lambda , ma attende il completamento dei trigger prima di restituire il controllo al client.

Esempio: richiama una AWS Lambda funzione per inviare e-mail

Nell'esempio seguente viene creata una stored procedure che è possibile chiamare nel codice del database per inviare un'e-mail utilizzando una funzione Lambda.

AWS Lambda Funzione

import boto3 ses = boto3.client('ses') def SES_send_email(event, context): return ses.send_email( Source=event['email_from'], Destination={ 'ToAddresses': [ event['email_to'], ] }, Message={ 'Subject': { 'Data': event['email_subject'] }, 'Body': { 'Text': { 'Data': event['email_body'] } } } )

Stored procedure

DROP PROCEDURE IF EXISTS SES_send_email; DELIMITER ;; CREATE PROCEDURE SES_send_email(IN email_from VARCHAR(255), IN email_to VARCHAR(255), IN subject VARCHAR(255), IN body TEXT) LANGUAGE SQL BEGIN CALL mysql.lambda_async( 'arn:aws:lambda:us-west-2:123456789012:function:SES_send_email', CONCAT('{"email_to" : "', email_to, '", "email_from" : "', email_from, '", "email_subject" : "', subject, '", "email_body" : "', body, '"}') ); END ;; DELIMITER ;

Chiama la stored procedure per chiamare la funzione AWS Lambda

mysql> call SES_send_email('example_from@amazon.com', 'example_to@amazon.com', 'Email subject', 'Email content');
Esempio: richiama una AWS Lambda funzione per pubblicare un evento da un trigger

Nell'esempio seguente viene creata una stored procedure che pubblica un evento utilizzando Amazon SNS. Il codice chiama la procedura da un trigger quando una riga viene aggiunta a una tabella.

AWS Lambda Funzione

import boto3 sns = boto3.client('sns') def SNS_publish_message(event, context): return sns.publish( TopicArn='arn:aws:sns:us-west-2:123456789012:Sample_Topic', Message=event['message'], Subject=event['subject'], MessageStructure='string' )

Stored procedure

DROP PROCEDURE IF EXISTS SNS_Publish_Message; DELIMITER ;; CREATE PROCEDURE SNS_Publish_Message (IN subject VARCHAR(255), IN message TEXT) LANGUAGE SQL BEGIN CALL mysql.lambda_async('arn:aws:lambda:us-west-2:123456789012:function:SNS_publish_message', CONCAT('{ "subject" : "', subject, '", "message" : "', message, '" }') ); END ;; DELIMITER ;

Tabella

CREATE TABLE 'Customer_Feedback' ( 'id' int(11) NOT NULL AUTO_INCREMENT, 'customer_name' varchar(255) NOT NULL, 'customer_feedback' varchar(1024) NOT NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Trigger

DELIMITER ;; CREATE TRIGGER TR_Customer_Feedback_AI AFTER INSERT ON Customer_Feedback FOR EACH ROW BEGIN SELECT CONCAT('New customer feedback from ', NEW.customer_name), NEW.customer_feedback INTO @subject, @feedback; CALL SNS_Publish_Message(@subject, @feedback); END ;; DELIMITER ;

Inserisci una riga nella tabella per attivare la notifica

mysql> insert into Customer_Feedback (customer_name, customer_feedback) VALUES ('Sample Customer', 'Good job guys!');