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.
Argomenti
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
-
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.
-
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.
-
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.
-
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.
-
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.
Indice
- Utilizzo delle funzioni native per chiamare una funzione Lambda
- Concessione del ruolo in Aurora MySQL versione 3
- Concessione del privilegio in Aurora MySQL versione 2
- Sintassi per la funzione lambda_sync
- Parametri per la funzione lambda_sync
- Esempio per la funzione lambda_sync
- Sintassi per la funzione lambda_async
- Parametri per la funzione lambda_async
- Esempio per la funzione lambda_async
- Invocazione di una funzione Lambda all'interno di un trigger
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
o role_name
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
Questo vale solo per la sessione attiva corrente. Quando ci si riconnette, è necessario eseguire nuovamente l'SET ROLE
istruzione per concedere i privilegi. Per ulteriori informazioni, consulta Istruzione SET ROLE
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 ROLE
istruzione in modo esplicito per attivare un ruolo. Per ulteriori informazioni, consulta activate_all_roles_on_login
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. INSERT
UPDATE
, 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.
Indice
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. INSERT
UPDATE
, 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!');