Tous les produits
Search
Centre de documentation

Function Compute:Accès à ApsaraDB RDS for MySQL

Dernière mise à jour :Aug 12, 2026

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

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 » ?.

  1. 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.

    Remarque

    Assurez-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.

  2. 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.

  3. Ajoutez le bloc CIDR du vSwitch obtenu à l'étape précédente à la liste d'autorisation d'accès à la base de données.

    Important

    Nous 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.

    1. Accédez à la liste des instances RDS, sélectionnez une région, puis cliquez sur l'ID de l'instance cible.

    2. 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.

      Remarque

      Les anciennes instances peuvent fonctionner en mode haute sécurité. Toutes les nouvelles instances utilisent le mode de liste d'autorisation standard.

    3. À 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.

  1. 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.

  2. 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.

  3. 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.

  4. Ajoutez l'Elastic IP Address obtenue à l'étape précédente à la liste d'autorisation d'accès à la base de données.

    Important

    Nous 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.

    1. Accédez à la liste des instances RDS, sélectionnez une région, puis cliquez sur l'ID de l'instance cible.

    2. 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.

      Remarque

      Les anciennes instances peuvent fonctionner en mode haute sécurité. Toutes les nouvelles instances utilisent le mode de liste d'autorisation standard.

    3. À 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 que 192.168.0.0/24. Séparez les entrées multiples par des virgules. Remarque : définir la liste d'autorisation sur 0.0.0.0/0 autorise l'accès depuis Internet public, tandis que la valeur 127.0.0.1 bloque 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

  1. 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)
    
  2. 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.

  3. 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_at et updated_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.

    Cliquez ici pour afficher la procédure Serverless Devs

    1. Installez Serverless Devs et Docker, puis configurez vos identifiants. Pour plus d'informations, consultez Démarrage rapide.

    2. Créez un répertoire de code nommé mycode, et préparez le fichier s.yaml ainsi que le fichier de code app.py. Un exemple de fichier s.yaml est fourni ci-dessous. Pour le code d'exemple, reportez-vous au code indiqué dans l'Étape 2 : Accéder à RDS depuis votre fonction.

      L'exemple s.yaml suivant concerne l'accès à une base de données RDS dans le même VPC. Pour accéder à une base de données entre différents VPC ou régions, consultez Scénario 2 : Entre différents VPC ou régions.

      # ------------------------------------
      #   Official documentation: https://manual.serverless-devs.com/user-guide/aliyun/#fc3
      #   Tips: https://manual.serverless-devs.com/user-guide/tips/
      #   If you have questions, join the DingTalk group: 33947367
      # ------------------------------------
      edition: 3.0.0
      name: hello-world-app
      access: "default"
      vars: # Global variables
        region: "cn-hangzhou"  # If you are accessing an RDS database in the same VPC, make sure the function is deployed in the same region as the RDS database.
      resources:
        hello_world:
          component: fc3 
          actions:       
            pre-${regex('deploy|local')}: 
              - component: fc3 build 
          props:
            region: ${vars.region}              
            functionName: "start-python-0t1m"
            runtime: custom.debian10
            description: 'hello world by serverless devs'
            timeout: 10
            memorySize: 512
            cpu: 0.5
            diskSize: 512
            code: ./code
            customRuntimeConfig:
              port: 9000
              command:
                - python3
                - app.py
            internetAccess: true
            vpcConfig:
             vpcId: vpc-bp1dxqii29fpkc8pw**** # The ID of the VPC where the database instance is located.
             securityGroupId: sg-bp12ly2ie92ixrfc**** # The security group ID.
             vSwitchIds: 
              - vsw-bp1ty76ijntee9z83**** # Make sure that the CIDR block of this vSwitch is added to the database instance's access whitelist.
            environmentVariables:
              PYTHONPATH: /code/python
              PATH: /code/python/bin:/var/fc/lang/python3.10/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
              MYSQL_HOST: rm-bp1j1y7657640z5****.mysql.rds.aliyuncs.com  # The internal endpoint of the database instance.
              MYSQL_PORT: "3306"  # The private port of the database instance.
              MYSQL_USER: dms_user_****  # The account for the database in the instance.
              MYSQL_PASSWORD: ****   # The password for the database account.
              MYSQL_DBNAME: db_test  # The name of the database created in the instance.
    3. Exécutez la commande suivante pour construire le projet.

      sudo s build --use-docker
    4. Exécutez la commande suivante pour déployer le projet.

      sudo s deploy -y
    5. Exécutez la commande suivante pour invoquer la fonction.

      Remarque

      Assurez-vous que le bloc CIDR du vSwitch ou l'Elastic IP Address configurée pour la fonction a été ajouté à la liste d'autorisation d'accès de l'instance de base de données. Pour plus d'informations, consultez Étape 1.

      sudo s invoke -e "{}"