Appel d'une fonction Lambda à partir d'un cluster de bases de données Amazon Aurora MySQL - Amazon Aurora

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Appel d'une fonction Lambda à partir d'un cluster de bases de données Amazon Aurora MySQL

Vous pouvez appeler une fonction AWS Lambda à partir d'un cluster de base de données Amazon Aurora Édition compatible avec MySQL avec la fonction native lambda_sync ou lambda_async. Avant d'appeler une fonction Lambda à partir d'un cluster de bases de données Aurora MySQL, le cluster de bases de données Aurora doit avoir accès à Lambda. Pour plus d'informations sur l'octroi d'un accès à Aurora MySQL, consultez Octroi à Aurora d'un accès à Lambda. Pour plus d'informations sur les fonctions stockées lambda_sync et lambda_async, consultez Appel d'une fonction Lambda avec une fonction native Aurora MySQL.

Vous pouvez également appeler une fonction AWS Lambda à l'aide d'une procédure stockée. L'utilisation d'une procédure stockée est cependant déconseillée. Il est vivement recommandé d'utiliser une fonction native Aurora MySQL si vous utilisez l'une des versions Aurora MySQL suivantes :

  • Aurora MySQL version 2 pour les clusters compatibles avec MySQL 5.7.

  • Aurora MySQL version 3.01 et ultérieure, pour les clusters compatibles MySQL 8.0. La procédure stockée n'est pas disponible dans Aurora MySQL version 3.

Octroi à Aurora d'un accès à Lambda

Pour pouvoir appeler des fonctions Lambda à partir d'un cluster de bases de données Aurora MySQL, veillez d'abord à octroyer à votre cluster une autorisation d'accès à Lambda.

Pour octroyer à Aurora MySQL un accès à Lambda
  1. Créez une stratégie AWS Identity and Access Management (IAM) pour fournir les autorisations permettant au cluster de base de données Aurora MySQL d'appeler des fonctions Lambda. Pour obtenir des instructions, consultez Création d'une stratégie IAM pour accéder aux ressources AWS Lambda.

  2. Créez un rôle IAM et attachez la stratégie IAM que vous avez créée dans Création d'une stratégie IAM pour accéder aux ressources AWS Lambda au nouveau rôle IAM. Pour obtenir des instructions, consultez Création d'un rôle IAM pour autoriser Amazon Aurora à accéder aux services AWS.

  3. Définissez le paramètre de cluster de bases de données aws_default_lambda_role sur l'Amazon Resource Name (ARN) du nouveau rôle IAM.

    Si le cluster fait partie d'une base de données globale Aurora, appliquez le même paramètre pour chaque cluster Aurora de cette base de données.

    Pour plus d'informations sur les paramètres de cluster de base de données, consultez Paramètres de cluster de base de données et d'instance de base de données Amazon Aurora.

  4. Pour autoriser les utilisateurs de base de données d'un cluster de bases de données Aurora MySQL à appeler des fonctions Lambda, associez le rôle que vous avez créé dans Création d'un rôle IAM pour autoriser Amazon Aurora à accéder aux services AWS au cluster de bases de données. Pour plus d'informations sur l'association d'un rôle IAM à un cluster de bases de données, consultez Association d'un rôle IAM à un cluster de bases de données Amazon Aurora MySQL.

    Si le cluster fait partie d'une base de données globale Aurora, associez le rôle à chaque cluster Aurora de cette base de données.

  5. Configurez votre cluster de bases de données Aurora MySQL de façon à autoriser les connexions sortantes vers Lambda. Pour obtenir des instructions, consultez Activation de la communication réseau entre Amazon Aurora MySQL et d'autres services AWS.

    Si le cluster fait partie d'une base de données globale Aurora, activez les connexions sortantes pour chaque cluster Aurora de cette base de données.

Appel d'une fonction Lambda avec une fonction native Aurora MySQL

Note

Vous pouvez appeler les fonctions natives lambda_sync et lambda_async quand vous utilisez Aurora MySQL version 2 ou Aurora MySQL version 3.01 ou ultérieure. Pour de plus amples informations sur les versions d'Aurora MySQL, veuillez consulter Mises à jour du moteur de base de données pour Amazon Aurora MySQL.

Vous pouvez appeler une fonction AWS Lambda à partir d'un cluster de base de données Aurora MySQL en appelant les fonctions natives lambda_sync et lambda_async. Cette approche peut être utile lorsque vous souhaitez intégrer votre base de données s'exécutant sur Aurora MySQL avec d'autres services AWS. Par exemple, vous pouvez souhaiter envoyer une notification avec Amazon Simple Notification Service (Amazon SNS) chaque fois qu'une ligne est insérée dans une table spécifique de votre base de données.

Utilisation d'une fonction Lambda avec une fonction native

Les fonctions natives lambda_sync et lambda_async sont des fonctions natives intégrées qui appellent une fonction Lambda de façon synchrone ou asynchrone. Lorsque vous devez connaître le résultat de la fonction Lambda avant de passer à une autre action, utilisez la fonction synchrone lambda_sync. Lorsque vous n'avez pas besoin de connaître le résultat de la fonction Lambda avant de passer à une autre action, utilisez la fonction asynchrone lambda_async.

Octroi du rôle dans Aurora MySQL version 3

Dans Aurora MySQL version 3, l'utilisateur qui appelle une fonction native doit disposer du rôle AWS_LAMBDA_ACCESS. Pour accorder ce rôle à un utilisateur, connectez-vous à l'instance de base de données en tant qu'utilisateur administratif, puis exécutez l'instruction suivante.

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

Vous pouvez révoquer ce rôle en exécutant l'instruction suivante.

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

Lorsque vous utilisez la technique de rôle dans Aurora MySQL version 3, vous pouvez également activer le rôle en utilisant l'instruction SET ROLE role_name ou SET ROLE ALL. Si vous n'êtes pas familier avec le système de rôles MySQL 8.0, vous pouvez en apprendre davantage dans Modèle de privilège basé sur les rôles. Pour plus de détails, consultez Utilisation des rôles (langue française non garantie) dans le Manuel de référence de MySQL.

Cela s'applique uniquement à la session active en cours. Lorsque vous vous reconnectez, vous devez à nouveau exécuter l'instruction SET ROLE pour accorder des privilèges. Pour plus d'informations, consultez SET ROLE statement dans le manuel MySQL Reference Manual.

Vous pouvez utiliser le paramètre activate_all_roles_on_login de cluster de bases de données pour activer automatiquement tous les rôles lorsqu'un utilisateur se connecte à une instance de base de données. Lorsque ce paramètre est défini, vous n'avez pas besoin d'appeler explicitement l'instruction SET ROLE pour activer un rôle. Pour plus d'informations, consultez activate_all_roles_on_login dans le manuel MySQL Reference Manual.

Si vous obtenez une erreur telle que la suivante lorsque vous essayez d'invoquer une fonction Lambda, exécutez une instruction SET ROLE.

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

Octroi du privilège dans Aurora MySQL version 2

Dans Aurora MySQL version 2, l'utilisateur qui appelle une fonction native doit se voir accorder le privilège INVOKE LAMBDA. Pour accorder ce privilège à un utilisateur, connectez-vous à l'instance de base de données en tant qu'utilisateur administratif, puis exécutez l'instruction suivante.

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

Vous pouvez révoquer ce privilège en exécutant l'instruction suivante.

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

Syntaxe de la fonction lambda_sync

Vous appelez la fonction lambda_sync de façon synchrone avec le type d'appel RequestResponse. La fonction renvoie le résultat de l'appel Lambda dans une charge utile JSON. La fonction a la syntaxe suivante.

lambda_sync ( lambda_function_ARN, JSON_payload )

Paramètres de la fonction lambda_sync

La fonction lambda_sync possède les paramètres suivants.

lambda_function_ARN

Amazon Resource Name (ARN) de la fonction Lambda à appeler.

JSON_payload

Charge utile de la fonction Lambda appelée au format JSON.

Note

Aurora MySQL version 3 prend en charge les fonctions d'analyse JSON de MySQL 8.0. Toutefois, Aurora MySQL version 2 n'inclut pas ces fonctions. L'analyse JSON n'est pas requise lorsqu'une fonction Lambda renvoie une valeur atomique, telle qu'un numéro ou une chaîne.

Exemple de la fonction lambda_sync

La requête suivante basée sur lambda_sync appelle la fonction Lambda BasicTestLambda de façon synchrone en utilisant l'ARN de la fonction. La charge utile de la fonction est {"operation": "ping"}.

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

Syntaxe de la fonction lambda_async

Vous appelez la fonction lambda_async de façon asynchrone avec le type d'appel Event. La fonction renvoie le résultat de l'appel Lambda dans une charge utile JSON. La fonction a la syntaxe suivante.

lambda_async ( lambda_function_ARN, JSON_payload )

Paramètres de la fonction lambda_async

La fonction lambda_async possède les paramètres suivants.

lambda_function_ARN

Amazon Resource Name (ARN) de la fonction Lambda à appeler.

JSON_payload

Charge utile de la fonction Lambda appelée au format JSON.

Note

Aurora MySQL version 3 prend en charge les fonctions d'analyse JSON de MySQL 8.0. Toutefois, Aurora MySQL version 2 n'inclut pas ces fonctions. L'analyse JSON n'est pas requise lorsqu'une fonction Lambda renvoie une valeur atomique, telle qu'un numéro ou une chaîne.

Exemple de la fonction lambda_async

La requête suivante basée sur lambda_async appelle la fonction Lambda BasicTestLambda de façon asynchrone en utilisant l'ARN de la fonction. La charge utile de la fonction est {"operation": "ping"}.

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

Appel d'une fonction Lambda dans un déclencheur

Vous pouvez utiliser des déclencheurs pour appeler Lambda sur les instructions de modification de données. L'exemple suivant utilise la fonction native lambda_async et stocke le résultat dans une variable.

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

Les déclencheurs ne sont pas exécutés une fois par instruction SQL, mais une fois par ligne modifiée, une ligne à la fois. Lorsqu'un déclencheur s'exécute, le processus est synchrone. L'instruction de modification des données n'est retournée que lorsque le déclencheur est terminé.

Soyez prudent lorsque vous appelez une fonction AWS Lambda à partir de déclencheurs sur des tables qui connaissent un trafic d'écriture élevé. Les déclencheurs INSERT, UPDATE et DELETE sont activés par ligne. Une charge de travail d'écriture intensive sur une table avec des déclencheurs INSERT, UPDATE ou DELETE produit un grand nombre d'appels de votre fonction AWS Lambda.

Appel d'une fonction Lambda avec une procédure stockée Aurora MySQL (obsolète)

Vous pouvez appeler une fonction AWS Lambda à partir d'un cluster de base de données Aurora MySQL en appelant la procédure mysql.lambda_async. Cette approche peut être utile lorsque vous souhaitez intégrer votre base de données s'exécutant sur Aurora MySQL avec d'autres services AWS. Par exemple, vous pouvez souhaiter envoyer une notification avec Amazon Simple Notification Service (Amazon SNS) chaque fois qu'une ligne est insérée dans une table spécifique de votre base de données.

Remarques relatives aux versions Aurora MySQL

Depuis Aurora MySQL version 2, vous pouvez utiliser la méthode des fonctions natives à la place de ces procédures stockées pour appeler une fonction Lambda. Pour de plus amples informations sur les fonctions natives, veuillez consulter Utilisation d'une fonction Lambda avec une fonction native.

Dans Aurora MySQL version 2, la procédure stockée mysql.lambda_async n'est plus prise en charge. Nous vous recommandons vivement de travailler plutôt avec des fonctions Lambda natives.

Dans Aurora MySQL version 3, la procédure stockée n'est pas disponible.

Utilisation de la procédure mysql.lambda_async pour appeler une fonction Lambda (obsolète)

La procédure mysql.lambda_async est une procédure stockée intégrée qui appelle une fonction Lambda de manière asynchrone. Pour utiliser cette procédure, votre utilisateur de base de données doit disposer du privilège EXECUTE sur la procédure stockée mysql.lambda_async.

Syntaxe

La procédure mysql.lambda_async possède la syntaxe suivante.

CALL mysql.lambda_async ( lambda_function_ARN, lambda_function_input )

Paramètres

La procédure mysql.lambda_async possède les paramètres suivants.

lambda_function_ARN

Amazon Resource Name (ARN) de la fonction Lambda à appeler.

lambda_function_input

Chaîne d'entrée, au format JSON, pour la fonction Lambda appelée.

Exemples

Au titre de bonne pratique, nous vous recommandons d'encapsuler les appels de la procédure mysql.lambda_async dans une procédure stockée qui peut être appelée depuis différentes sources, telles que des déclencheurs ou le code client. Cette approche peut permettre d'éviter les problèmes d'incohérence d'impédance et faciliter l'appel des fonctions Lambda.

Note

Soyez prudent lorsque vous appelez une fonction AWS Lambda à partir de déclencheurs sur des tables qui connaissent un trafic d'écriture élevé. Les déclencheurs INSERT, UPDATE et DELETE sont activés par ligne. Une charge de travail d'écriture intensive sur une table avec des déclencheurs INSERT, UPDATE ou DELETE produit un grand nombre d'appels de votre fonction AWS Lambda.

Même si les appels à la procédure mysql.lambda_async sont asynchrones, les déclencheurs sont synchrones. Une instruction qui produit un grand nombre d'activation de déclencheur n'attend pas la fin de l'appel de la fonction AWS Lambda, elle attend que les déclencheurs se terminent avant de rendre le contrôle au client.

Exemple : invoquer une fonction AWS Lambda pour envoyer un e-mail

L'exemple suivant crée une procédure stockée que vous pouvez appeler dans votre code de base de données pour envoyer un e-mail à l'aide d'une fonction Lambda.

Fonction AWS Lambda

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'] } } } )

Procédure stockée

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 ;

Appel de la procédure stockée pour appeler la fonction AWS Lambda

mysql> call SES_send_email('example_from@amazon.com', 'example_to@amazon.com', 'Email subject', 'Email content');
Exemple : invoquer une fonction AWS Lambda pour publier un événement à partir d'un déclencheur

L'exemple suivant crée une procédure stockée qui publie un événement avec Amazon SNS. Le code appelle la procédure à partir d'un déclencheur lorsqu'une ligne est ajoutée à une table.

Fonction AWS Lambda

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' )

Procédure stockée

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 ;

Tableau 

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;

Déclencheur

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 ;

Insertion d'une ligne dans la table pour déclencher la notification

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