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.
Tutoriel : Utilisation d'une fonction Lambda pour accéder à une base de données Amazon RDS
Dans ce tutoriel, vous allez utiliser une fonction Lambda pour écrire des données dans une base de données Amazon Relational Database Service (Amazon RDS) via un proxy RDS. Votre fonction Lambda lit les enregistrements d'une file d'attente Amazon Simple Queue Service (Amazon SQS) et écrit un nouvel élément dans une table de votre base de données chaque fois qu'un message est ajouté. Dans cet exemple, vous utilisez la AWS Management Console pour ajouter manuellement des messages à votre file d'attente. Le schéma suivant montre les AWS ressources que vous utilisez pour suivre le didacticiel.
Grâce à Amazon RDS, vous pouvez exécuter une base de données relationnelle gérée dans le cloud à l'aide de produits de base de données courants tels que Microsoft SQL Server, MariaDB, MySQL, Oracle Database et PostgreSQL. En utilisant Lambda pour accéder à votre base de données, vous pouvez lire et écrire des données en réponse aux événements, tels que l'enregistrement d'un nouveau client sur votre site web. Votre fonction, votre instance de base de données et votre proxy sont automatiquement mis à l'échelle pour répondre aux périodes de demandes élevées.
Pour compléter ce tutoriel, effectuez les tâches suivantes :
-
Lancez une instance de base de données RDS for MySQL et un proxy dans votre Compte AWS VPC par défaut.
-
Créez et testez une fonction Lambda qui crée une nouvelle table dans votre base de données et y écrit des données.
-
Créez une file d'attente Amazon SQS et configurez-la pour invoquer votre fonction Lambda chaque fois qu'un nouveau message est ajouté.
-
Testez la configuration complète en ajoutant des messages à votre file d'attente à l'aide des journaux AWS Management Console et en surveillant les résultats à l'aide CloudWatch des journaux.
En suivant ces étapes, vous apprendrez à :
Utiliser Amazon RDS pour créer une instance de base de données et un proxy, et connecter une fonction Lambda au proxy.
Utiliser Lambda pour effectuer des opérations de création et de lecture sur une base de données Amazon RDS.
Utiliser Amazon SQS pour invoquer une fonction Lambda.
Vous pouvez terminer ce didacticiel en utilisant le AWS Management Console ou le AWS Command Line Interface (AWS CLI).
Prérequis
Avant de commencer, suivez les étapes détaillées dans les sections suivantes :
Créer une instance de base de données Amazon RDS
Une instance de base de données Amazon RDS est un environnement de base de données isolé qui s'exécute dans le AWS Cloud. Une instance peut comporter une ou plusieurs bases de données créées par l'utilisateur. Sauf indication contraire de votre part, Amazon RDS crée de nouvelles instances de base de données dans le VPC par défaut inclus dans votre. Compte AWS Pour plus d'informations sur le VPC Amazon, consultez le Guide de l'utilisateur Amazon Virtual Private Cloud.
Dans ce didacticiel, vous allez créer une nouvelle instance dans votre Compte AWS VPC par défaut et créer une base de données nommée ExampleDB
dans cette instance. Vous pouvez créer votre instance de base de données et votre base de données à l'aide du AWS Management Console ou du AWS CLI.
Pour créer une instance de base de données
-
Ouvrez la console Amazon RDS et choisissez Créer une base de données.
-
Ne désélectionnez pas l'option Création standard, puis dans Options de moteur, choisissez MySQL.
-
Dans Modèles, choisissez Offre gratuite.
-
Dans Paramètres, pour Identifiant de l'instance de base de données, saisissez
MySQLForLambda
. -
Définissez votre nom d'utilisateur et votre mot de passe en procédant comme suit :
-
Dans Configuration des informations d'identification, conservez le paramètre Identifiant principal défini sur
admin
. -
Pour Mot de passe principal, saisissez et confirmez un mot de passe pour accéder à votre base de données.
-
-
Spécifiez le nom de la base de données en procédant comme suit :
-
Laissez toutes les autres options par défaut sélectionnées et faites défiler l'affichage vers le bas jusqu'à la section Configuration supplémentaire.
-
Développez cette section et saisissez
ExampleDB
comme Nom de la base de données initiale.
-
-
Ne désélectionnez pas les options par défaut restantes et choisissez Créer une base de données.
Création d'une fonction Lambda et d'un proxy
Vous pouvez utiliser la console RDS pour créer une fonction Lambda et un proxy dans le même VPC que la base de données.
Note
Vous ne pouvez créer ces ressources associées que lorsque la création de votre base de données est terminée et qu'elle a le statut Disponible.
Pour créer une fonction et un proxy associés
-
Dans la page Bases de données, vérifiez si votre base de données a le statut Disponible. Si tel est le cas, passez à l'étape suivante. Sinon, attendez que votre base de données soit disponible.
-
Sélectionnez votre base de données et choisissez Configurer une connexion Lambda dans Actions.
-
Dans la page Configurer une connexion Lambda, choisissez Créer une nouvelle fonction.
Définissez Nouveau nom de fonction Lambda sur
LambdaFunctionWithRDS
. -
Dans la section Proxy RDS, sélectionnez l'option Se connecter via un proxy RDS. Choisissez encore Créer un nouveau proxy.
-
Pour Informations d'identification de la base de données, choisissez Nom d'utilisateur et mot de passe de base de données.
-
PourNom d'utilisateur, spécifiez
admin
. -
Pour Mot de passe, saisissez le mot de passe que vous avez créé pour votre instance de base de données.
-
-
Sélectionnez Configurer pour terminer la création du proxy et de la fonction Lambda.
L'assistant termine la configuration et fournit un lien vers la console Lambda pour que vous passiez en revue votre nouvelle fonction. Prenez note du point de terminaison du proxy avant de passer à la console Lambda.
Pour créer un rôle d'exécution de fonction
Avant de créer votre fonction Lambda, vous devez créer un rôle d'exécution pour donner à votre fonction les autorisations nécessaires. Pour ce tutoriel, Lambda a besoin d'une autorisation pour gérer la connexion réseau au VPC contenant votre instance de base de données et pour interroger les messages d'une file d'attente Amazon SQS.
Pour donner à votre fonction Lambda les autorisations dont elle a besoin, ce tutoriel utilise des politiques gérées par IAM. Il s'agit de politiques accordant des autorisations pour de nombreux cas d'utilisation courants et disponibles dans votre Compte AWS. Pour en savoir plus sur l'utilisation des politiques gérées, consultez Bonnes pratiques en matière de politiques.
Pour créer le rôle d'exécution Lambda
-
Ouvrez la page Rôles
de la console IAM et choisissez Créer un rôle. -
Pour Type d'entité approuvée, choisissez Service AWS et pour Cas d'utilisation, choisissez Lambda.
-
Choisissez Suivant.
-
Ajoutez les politiques gérées par IAM en procédant comme suit :
-
À l'aide du champ de recherche de la politique, recherchez
AWSLambdaSQSQueueExecutionRole
. -
Dans la liste des résultats, cochez la case à côté du rôle, puis choisissez Effacer les filtres.
-
À l'aide du champ de recherche de la politique, recherchez
AWSLambdaVPCAccessExecutionRole
. -
Dans la liste des résultats, cochez la case à côté du rôle, puis choisissez Suivant.
-
-
Pour Nom du rôle, saisissez
lambda-vpc-sqs-role
, puis choisissez Créer un rôle.
Plus loin dans le tutoriel, vous aurez besoin de l'Amazon Resource Name (ARN) du rôle d'exécution que vous venez de créer.
Pour trouver l'ARN du rôle d'exécution
-
Ouvrez la page Rôles
de la console IAM et choisissez votre rôle ( lambda-vpc-sqs-role
). -
Copiez l'ARN affiché dans la section Récapitulatif.
Création d'un package de déploiement Lambda
L'exemple de code Python suivant utilise le package PyMySQLCustomer
. Le tableau utilise le schéma suivant, où CustID
se trouve la clé primaire :
Customer(CustID, Name)
La fonction utilise également le PyMy langage SQL pour ajouter des enregistrements à cette table. La fonction ajoute des enregistrements à l'aide des ID des clients et des noms spécifiés dans les messages que vous ajouterez à votre file d'attente Amazon SQS.
Le code crée la connexion à votre base de données en dehors de la fonction de gestionnaire. La création de la connexion dans le code d'initialisation permet de réutiliser la connexion lors des invocations ultérieures de votre fonction et améliore les performances. Dans une application de production, vous pouvez également utiliser la simultanéité provisionnée pour initialiser le nombre requis de connexions à la base de données. Ces connexions sont disponibles dès que votre fonction est invoquée.
import sys import logging import pymysql import json import os # rds settings user_name = os.environ['USER_NAME'] password = os.environ['PASSWORD'] rds_proxy_host = os.environ['RDS_PROXY_HOST'] db_name = os.environ['DB_NAME'] logger = logging.getLogger() logger.setLevel(logging.INFO) # create the database connection outside of the handler to allow connections to be # re-used by subsequent function invocations. try: conn = pymysql.connect(host=rds_proxy_host, user=user_name, passwd=password, db=db_name, connect_timeout=5) except pymysql.MySQLError as e: logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.") logger.error(e) sys.exit(1) logger.info("SUCCESS: Connection to RDS for MySQL instance succeeded") def lambda_handler(event, context): """ This function creates a new RDS database table and writes records to it """ message = event['Records'][0]['body'] data = json.loads(message) CustID = data['CustID'] Name = data['Name'] item_count = 0 sql_string = f"insert into Customer (CustID, Name) values(%s, %s)" with conn.cursor() as cur: cur.execute("create table if not exists Customer ( CustID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (CustID))") cur.execute(sql_string, (CustID, Name)) conn.commit() cur.execute("select * from Customer") logger.info("The following items have been added to the database:") for row in cur: item_count += 1 logger.info(row) conn.commit() return "Added %d items to RDS for MySQL table" %(item_count)
Note
Dans cet exemple, vos informations d'identification d'accès à la base de données sont stockées sous forme de variables d'environnement. Dans les applications de production, nous vous recommandons d'utiliser AWS Secrets Manager comme option plus sécurisée. Notez que si votre fonction Lambda se trouve dans un VPC, pour vous connecter à Secrets Manager, vous devez créer un point de terminaison de VPC. Consultez Comment se connecter au service Secrets Manager dans un cloud privé virtuel
Pour inclure la dépendance PyMy SQL dans votre code de fonction, créez un package de déploiement .zip. Les commandes suivantes fonctionnent sous Linux, macOS et Unix :
Pour créer un package de déploiement .zip
-
Enregistrez l'exemple de code en tant que fichier nommé
lambda_function.py
. -
Dans le répertoire dans lequel vous avez créé votre
lambda_function.py
fichier, créez un nouveau répertoire nommépackage
et installez la bibliothèque PyMy SQL.mkdir package
pip install --target package pymysql
-
Créez un fichier zip contenant le code de votre application et la bibliothèque PyMy SQL. Sous Linux ou macOS, exécutez les commandes CLI suivantes. Sous Windows, utilisez l'outil zip de votre choix pour créer le fichier
lambda_function.zip
. Votre fichier de code sourcelambda_function.py
et les dossiers contenant vos dépendances doivent être installés à la racine du fichier .zip.cd package
zip -r ../lambda_function.zip .
cd ..
zip lambda_function.zip lambda_function.py
Vous pouvez également créer votre package de déploiement à l'aide d'un environnement virtuel Python. Consultez Déployer des fonctions Lambda en Python avec des archives de fichiers .zip.
Mise à jour de la fonction Lambda
À l'aide du package .zip que vous venez de créer, vous mettez désormais à jour votre fonction Lambda en utilisant la console Lambda. Pour permettre à votre fonction d'accéder à votre base de données, vous devez également configurer des variables d'environnement avec vos informations d'identification d'accès.
Pour mettre à jour la fonction Lambda
-
Ouvrez la page Fonctions
de la console Lambda et choisissez votre fonction LambdaFunctionWithRDS
. -
Dans l'onglet Paramètres d'exécution, sélectionnez Modifier pour remplacer le Runtime de la fonction par Python 3.10.
-
Modifiez le paramètre Gestionnaire en spécifiant
lambda_function.lambda_handler
. -
Dans l'onglet Code, choisissez Charger depuis, puis Fichier .zip.
-
Sélectionnez le fichier
lambda_function.zip
que vous avez créé à l'étape précédente et choisissez Enregistrer.
Configurez maintenant la fonction avec le rôle d'exécution que vous avez créé précédemment. Cela octroie à la fonction les autorisations dont elle a besoin pour accéder à votre instance de base de données et interroger une file d'attente Amazon SQS.
Pour configurer le rôle d'exécution de la fonction
-
Sur la page Fonctions
de la console Lambda, sélectionnez l'onglet Configuration, puis choisissez Autorisations. -
Dans Rôle d'exécution, choisissez Modifier.
-
Dans Rôle existant, choisissez votre rôle d'exécution (
lambda-vpc-sqs-role
). -
Choisissez Enregistrer.
Pour configurer les variables d'environnement de votre fonction
-
Sur la page Fonctions
de la console Lambda, sélectionnez l'onglet Configuration, puis choisissez Variables d'environnement. -
Choisissez Modifier.
-
Pour ajouter vos informations d'identification d'accès à la base de données, procédez comme suit :
-
Choisissez Ajouter une variable d'environnement, puis pour Clé saisissez
USER_NAME
et pour Valeur saisissezadmin
. -
Choisissez Ajouter une variable d'environnement, puis pour Clé saisissez
DB_NAME
et pour Valeur saisissezExampleDB
. -
Choisissez Ajouter une variable d'environnement, puis pour Clé saisissez
PASSWORD
et pour Valeur saisissez le mot de passe que vous avez choisi lors de la création de votre base de données. -
Choisissez Ajouter une variable d'environnement, puis, pour Clé, saisissez
RDS_PROXY_HOST
, et pour Valeur, saisissez le point de terminaison du proxy RDS que vous avez noté plus tôt. -
Choisissez Enregistrer.
-
Test de votre fonction Lambda dans la console
Vous pouvez désormais utiliser la console Lambda pour tester votre fonction. Vous créez un événement de test qui imite les données que votre fonction recevra lorsque vous l'invoquerez à l'aide d'Amazon SQS lors de la dernière étape du tutoriel. Votre événement de test contient un objet JSON spécifiant un ID de client et un nom de client à ajouter à la table Customer
créée par votre fonction.
Pour tester la fonction Lambda
-
Ouvrez la page Fonctions
de la console Lambda et choisissez votre fonction. -
Choisissez la section Tester.
-
Choisissez Créer un événement et entrez
myTestEvent
pour le nom de l'événement. -
Copiez le code suivant dans Event JSON et choisissez Enregistrer.
{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "{\n \"CustID\": 1021,\n \"Name\": \"Martha Rivera\"\n}", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue", "awsRegion": "us-west-2" } ] }
-
Sélectionnez Tester).
Dans l'onglet Résultats de l'exécution, vous devriez voir des résultats similaires aux suivants, affichés dans les journaux de fonctions :
[INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f The following items have been added to the database: [INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f (1021, 'Martha Rivera')
Créez une file d’attente Amazon SQS.
Vous avez réussi à tester l'intégration de votre fonction Lambda et de votre instance de base de données Amazon RDS. Créez maintenant la file d'attente Amazon SQS que vous utiliserez pour invoquer votre fonction Lambda lors de la dernière étape du tutoriel.
Pour créer une file d'attente Amazon SQS (console)
-
Ouvrez la page Files d'attente
de la console Amazon SQS et sélectionnez Créer une file d'attente. -
Conservez le type comme Standard et saisissez
LambdaRDSQueue
pour le nom de votre file d'attente. -
Ne désélectionnez pas les options par défaut et choisissez Créer une file d'attente.
Création d'un mappage des sources d'événements pour invoquer votre fonction Lambda
Un mappage des sources d'événements est une ressource Lambda qui lit des éléments à partir d'un flux ou d'une file d'attente et invoque une fonction Lambda. Lorsque vous configurez un mappage des sources d'événements, vous pouvez spécifier une taille de lot afin que les enregistrements de votre flux ou de votre file d'attente soient regroupés dans une même charge utile. Dans cet exemple, vous définissez une taille de lot sur 1 afin que votre fonction Lambda soit invoquée chaque fois que vous envoyez un message à votre file d'attente. Vous pouvez configurer le mappage des sources d'événements à l'aide de la console Lambda AWS CLI ou de la console Lambda.
Pour créer un mappage des sources d'événements (console)
-
Ouvrez la page Fonctions
de la console Lambda et choisissez votre fonction ( LambdaFunctionWithRDS
). -
Dans la section Présentation de la fonction, choisissez Ajouter un déclencheur.
-
Pour la source, sélectionnez Amazon SQS, puis sélectionnez le nom de votre file d'attente (
LambdaRDSQueue
). -
Pour la Taille de lot, saisissez
1
. -
Conservez les valeurs par défaut de toutes les autres options et choisissez Ajouter.
Vous pouvez désormais tester votre configuration complète en ajoutant un message à votre file d'attente Amazon SQS.
Test et surveillance de votre configuration
Pour tester votre configuration complète, ajoutez des messages à votre file d'attente Amazon SQS à l'aide de la console. Vous utilisez ensuite CloudWatch Logs pour confirmer que votre fonction Lambda écrit des enregistrements dans votre base de données comme prévu.
Pour tester et surveiller votre configuration
-
Ouvrez la page Files d'attente
de la console Amazon SQS et sélectionnez votre file d'attente ( LambdaRDSQueue
). -
Choisissez Envoyer et recevoir des messages, puis collez le code JSON suivant dans le champ Corps du message, dans la section Envoyer un message.
{
"CustID": 1054,
"Name": "Richard Roe"
}
-
Choisissez Send Message (Envoyer un message).
L'envoi de votre message à la file d'attente obligera Lambda à invoquer votre fonction via le mappage des sources d'événements. Pour confirmer que Lambda a invoqué votre fonction comme prévu, utilisez CloudWatch Logs pour vérifier que la fonction a écrit le nom et l'ID du client dans votre table de base de données.
-
Ouvrez la page Groupes de journaux
de la CloudWatch console et sélectionnez le groupe de journaux pour votre fonction ( /aws/lambda/LambdaFunctionWithRDS
). -
Dans la section Flux de journaux, choisissez le flux de journaux le plus récent.
Votre table doit contenir deux enregistrements clients, un pour chaque invocation de votre fonction. Dans le flux de journaux, vous devriez voir des messages similaires à ce qui suit :
[INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 The following items have been added to the database: [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1021, 'Martha Rivera') [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1054, 'Richard Roe')
Nettoyage de vos ressources
Vous pouvez maintenant supprimer les ressources que vous avez créées pour ce didacticiel, sauf si vous souhaitez les conserver. En supprimant AWS les ressources que vous n'utilisez plus, vous évitez des frais inutiles sur votre AWS compte.
Pour supprimer la fonction Lambda
-
Ouvrez la page Functions (Fonctions)
de la console Lambda. -
Sélectionnez la fonction que vous avez créée.
-
Sélectionnez Actions, Supprimer.
-
Sélectionnez Supprimer.
Pour supprimer le rôle d'exécution
-
Ouvrez la page Roles (Rôles)
de la console IAM. -
Sélectionnez le rôle d'exécution que vous avez créé.
-
Choisissez Supprimer le rôle.
-
Choisissez Oui, supprimer.
Pour supprimer l'instance de base de données MySQL
-
Ouvrez la page Bases de données
de la console Amazon RDS. -
Sélectionnez la base de données que vous avez créée.
-
Sélectionnez Actions, Supprimer.
-
Désactivez la case à cocher Create final snapshot (Créer un instantané final).
-
Saisissez
delete me
dans la zone de texte. -
Choisissez Supprimer.
Pour supprimer la file d'attente Amazon SQS
-
Sélectionnez la file d’attente que vous avez créée.
-
Choisissez Supprimer.
-
Saisissez
delete
dans la zone de texte. -
Sélectionnez Supprimer.