Dans Function Compute, les instances d'exécution sont sans état. Une base de données permet de persister des données structurées et de partager un état. En accédant à une base de données cloud depuis Function Compute, vous pouvez exécuter des opérations telles que des requêtes et des insertions de données. Cette rubrique prend l'exemple d'une fonction Python pour expliquer comment accéder à une instance ApsaraDB RDS for MySQL depuis le même VPC, ou entre différents VPC et régions.
Prérequis
Le code d'exemple
index.pyprésenté dans cette rubrique interroge toutes les données d'une table nomméeusers. Modifiez le nom de la table selon vos besoins, mais assurez-vous qu'elle contient au moins un enregistrement.
Procédure
Étape 1 : Configurer la liste d'autorisation de la base de données
Scénario 1 : Même VPC
Pour accéder à une base de données située dans le même VPC, vérifiez que l'instance de base de données et la fonction se trouvent dans la même région. Nous vous recommandons de créer l'instance de base de données dans une zone prise en charge par Function Compute. Pour plus d'informations, consultez Zones prises en charge par Function Compute. Si votre instance de base de données ne se trouve pas dans une zone prise en charge, créez un vSwitch dans la même zone que votre fonction et spécifiez son ID dans la configuration VPC de la fonction. Les vSwitches d'un même VPC communiquant entre eux via le réseau privé, votre fonction peut utiliser ce vSwitch pour accéder aux ressources situées dans d'autres zones du VPC. Pour plus d'informations, consultez Que faire si je reçois l'erreur « vSwitch is in unsupported zone » ?.
-
Connectez-vous à la console Function Compute et créez une fonction web Python. Sur la page de détails de la fonction, sélectionnez l'onglet Configuration, puis cliquez sur Modify dans la section Advanced Settings. Dans le panneau Advanced Settings, localisez la section Network, activez l'accès VPC pour la fonction et configurez les ressources VPC de destination.
RemarqueAssurez-vous que le VPC configuré pour la fonction correspond bien au VPC auquel l'instance de base de données est rattachée.
Vous pouvez configurer le VPC, le vSwitch et le security group. Nous vous recommandons de déployer des vSwitches dans au moins deux zones afin de tirer pleinement parti des capacités de reprise après sinistre multizone de Function Compute et de renforcer la haute disponibilité de votre service. Les zones prises en charge dans la région actuelle sont cn-hangzhou-h, i, j, k, f, g et b.
Sur la page de détails de la fonction, accédez à l'onglet Configuration. Dans la section Network, récupérez le bloc CIDR du vSwitch configuré pour la fonction.
-
Ajoutez le bloc CIDR du vSwitch obtenu à l'étape précédente à la liste d'autorisation d'accès à la base de données.
ImportantNous vous recommandons d'autoriser l'accès à la fonction via une liste d'autorisation d'adresses IP plutôt que par un groupe de sécurité. L'utilisation d'un groupe de sécurité peut entraîner des échecs de connexion intermittents susceptibles d'affecter votre service.
Accédez à la liste des instances RDS, sélectionnez une région, puis cliquez sur l'ID de l'instance cible.
-
Dans le volet de navigation de gauche, cliquez sur Whitelist and SecGroup.
La page Whitelist Settings affiche le mode de liste d'autorisation IP actuel.
RemarqueLes anciennes instances peuvent fonctionner en mode haute sécurité. Toutes les nouvelles instances utilisent le mode de liste d'autorisation standard.
À droite du groupe default, cliquez sur Modify. Dans la boîte de dialogue Edit Whitelist, ajoutez le bloc CIDR IPv4 du vSwitch obtenu à l'étape 2 à la liste d'autorisation, puis cliquez sur OK.
Une fois la configuration terminée, la fonction peut accéder à la base de données RDS via son endpoint interne.
Scénario 2 : Entre différents VPC ou régions
Les VPC et les régions sont logiquement isolés. Par défaut, l'accès à une base de données entre différents VPC ou régions est impossible. Pour y parvenir, configurez une adresse IP publique statique pour votre fonction. Le système crée alors une passerelle NAT publique dans le VPC de la fonction, permettant ainsi à celle-ci d'accéder à la base de données via Internet en utilisant cette adresse IP publique.
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, cliquez sur Functions. Sélectionnez une région, puis créez une fonction en suivant les instructions.
Sur la page de détails de la fonction, cliquez sur l'onglet Configuration. Dans la section Advanced Settings, cliquez sur Modify. Dans le panneau Advanced Settings, localisez la section Network. Pour activer l'IP publique statique, activez Static Public IP Address et désactivez Allow Default NIC to Access Internet. Cliquez ensuite sur Deploy.
Sur la page de détails de la fonction, accédez à l'onglet Configuration. Dans la section Network, récupérez l'Elastic IP Address configurée pour la fonction.
-
Ajoutez l'Elastic IP Address obtenue à l'étape précédente à la liste d'autorisation d'accès à la base de données.
ImportantNous vous recommandons d'autoriser l'accès à la fonction via une liste d'autorisation d'adresses IP plutôt que par un groupe de sécurité. L'utilisation d'un groupe de sécurité peut entraîner des échecs de connexion intermittents susceptibles d'affecter votre service.
Accédez à la liste des instances RDS, sélectionnez une région, puis cliquez sur l'ID de l'instance cible.
-
Dans le volet de navigation de gauche, cliquez sur Whitelist and SecGroup.
La page Whitelist Settings affiche le mode de liste d'autorisation IP actuel.
RemarqueLes anciennes instances peuvent fonctionner en mode haute sécurité. Toutes les nouvelles instances utilisent le mode de liste d'autorisation standard.
-
À droite du groupe default, cliquez sur Modify. Dans la boîte de dialogue Edit Whitelist, ajoutez l'adresse IP publique statique obtenue à l'étape 3 à la liste d'autorisation, puis cliquez sur OK.
Une liste d'autorisation peut contenir des adresses IP spécifiques, comme
192.168.0.1, ainsi que des blocs CIDR, tels que192.168.0.0/24. Séparez les entrées multiples par des virgules. Remarque : définir la liste d'autorisation sur0.0.0.0/0autorise l'accès depuis Internet public, tandis que la valeur127.0.0.1bloque tout accès externe. La nouvelle liste d'autorisation prend effet sous environ une minute.
Une fois la configuration terminée, la fonction peut accéder à la base de données RDS via son endpoint public.
Étape 2 : Accéder à RDS depuis votre fonction
-
Connectez-vous à la console Function Compute. Dans la liste des fonctions, localisez la fonction cible. Sur sa page de détails, cliquez sur l'onglet Code et saisissez le code d'exemple suivant dans l'éditeur.
from flask import Flask, jsonify import pymysql import os from datetime import datetime import logging app = Flask(__name__) # Global variable to store the singleton MySQL connection _mysql_connection = None # Create a database connection (singleton pattern) def getConnection(): global _mysql_connection try: # If the connection exists and is active, return it. if _mysql_connection is not None: try: # Test if the connection is valid with a simple query. with _mysql_connection.cursor() as cursor: cursor.execute("SELECT 1") # A simple query to test the connection status result = cursor.fetchone() if result and result[0] == 1: return _mysql_connection except pymysql.OperationalError: # If the connection is broken, reset it. _mysql_connection = None # If the connection does not exist or is broken, create a new one. _mysql_connection = pymysql.connect( host=os.environ['MYSQL_HOST'], port=int(os.environ['MYSQL_PORT']), user=os.environ['MYSQL_USER'], password=os.environ['MYSQL_PASSWORD'], db=os.environ['MYSQL_DBNAME'] ) return _mysql_connection except Exception as e: logging.error(f"Error occurred during database connection: {e}") raise @app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']) def hello_world(path): conn = getConnection() try: with conn.cursor() as cursor: # Query all records from the users table. You must change 'users' to your actual table name. sql = "SELECT * FROM users" cursor.execute(sql) result = cursor.fetchall() columns = [desc[0] for desc in cursor.description] # Get the list of column names # Convert the query result to a list of dictionaries users = [] for row in result: user = {} for idx, column_name in enumerate(columns): value = row[idx] if isinstance(value, datetime): # Handle datetime fields user[column_name] = value.strftime('%Y-%m-%d %H:%M:%S') else: user[column_name] = value users.append(user) if users: # Return the JSON response with all users return jsonify(users), 200 else: # If no users are found, return a 404 error return jsonify({'error': 'No users found'}), 404 except Exception as e: logging.error(f"Error occurred during database operation: {e}") return jsonify({'error': 'Database error'}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=9000) -
Sur la page de détails de la fonction, sélectionnez l'onglet Configuration, localisez Advanced Settings, puis cliquez sur Modify à sa droite. Dans le panneau Advanced Settings, localisez la section Environment Variables, configurez les variables d'environnement suivantes, puis cliquez sur Deploy.
Paramètre
Valeur
Description
MYSQL_HOST
rm-bp19u8e76ae****.mysql.rds.aliyuncs.com
Endpoint de l'instance RDS.
-
Pour accéder à une base de données RDS dans le même VPC, définissez cette variable d'environnement sur l'endpoint interne de la base de données.
-
Pour accéder à une base de données RDS entre différents VPC ou régions, définissez cette variable d'environnement sur l'endpoint public de la base de données.
Dans la liste des instances RDS, cliquez sur l'ID de l'instance RDS cible. Dans le volet de navigation de gauche, cliquez sur Database Connection. Sur la page Database Connection, vous pouvez obtenir l'endpoint interne ou public de la base de données.
MYSQL_DBNAME
db_test
Nom de la base de données créée dans l'instance RDS.
MYSQL_PASSWORD
*
Mot de passe de la base de données.
MYSQL_PORT
3306
Port privé de l'instance de base de données.
MYSQL_USER
dms_user_****
Nom du compte créé dans l'instance RDS.
-
-
Sur la page de détails de la fonction, cliquez sur l'onglet Code, puis sur Test Function. Une fois la fonction exécutée avec succès, vérifiez le résultat retourné pour confirmer que la requête s'est terminée correctement.
Les données JSON retournées contiennent des enregistrements utilisateur avec des champs tels que
id,username,email,password_hash,created_atetupdated_at.
Informations complémentaires
Pour consulter d'autres exemples d'accès à une base de données ApsaraDB RDS for MySQL, reportez-vous à Function Compute Python accessing MySQL database.
En cas de problème d'accès à votre base de données, effectuez un dépannage en fonction des symptômes observés. Pour plus d'informations, consultez Causes courantes des échecs d'accès à la base de données.
ApsaraDB RDS prend en charge les moteurs de base de données MySQL, SQL Server, PostgreSQL et MariaDB. Pour plus d'informations, consultez Présentation d'ApsaraDB RDS.
-
Pour utiliser l'outil en ligne de commande Serverless Devs afin de créer une fonction et d'accéder à une base de données ApsaraDB RDS for MySQL, suivez les étapes ci-dessous.