Share via


Exemple : utiliser les bibliothèques Azure pour créer une base de données

Cet exemple montre comment utiliser les bibliothèques de gestion du Kit de développement logiciel (SDK) Azure dans un script Python pour créer une instance de serveur et une base de données flexibles Azure Database pour MySQL. Il fournit également un script simple pour interroger la base de données à l’aide de la bibliothèque mysql-connector (qui ne fait pas partie du kit Azure SDK). Vous pouvez utiliser du code similaire pour créer une instance de serveur et une base de données flexibles Azure Database pour PostgreSQL.

Les commandes Azure CLI équivalentes sont plus loin dans cet article. Si vous préférez utiliser le Portail Azure, consultez Créer un serveur MySQL ou Créer un serveur PostgreSQL.

Sauf indication contraire, toutes les commandes de cet article fonctionnent de la même façon dans les interpréteurs de commandes Windows et bash Linux/macOS.

1 : Configurer votre environnement de développement local

Si ce n’est déjà fait, configurez un environnement dans lequel vous pouvez exécuter le code. Voici quelques options possibles :

2 : Installer les packages de bibliothèque Azure nécessaires

Créez un fichier nommé requirements.txt avec le contenu suivant :

azure-mgmt-resource
azure-mgmt-rdbms
azure-identity
mysql-connector-python

Dans un terminal avec l’environnement virtuel activé, installez les conditions requises :

pip install -r requirements.txt

Remarque

Sur Windows, toute tentative d’installation de la bibliothèque mysql dans une bibliothèque Python 32 bits génère une erreur liée au fichier mysql.h. Dans ce cas, installez une version 64 bits de Python, puis réessayez.

3 : Écrire du code pour créer la base de données

Créez un fichier Python nommé provision_db.py avec le code suivant. Les commentaires expliquent les détails. En particulier, spécifiez des variables d’environnement pour AZURE_SUBSCRIPTION_ID et PUBLIC_IP_ADDRESS. La dernière variable est l’adresse IP de votre station de travail pour que cet exemple s’exécute. Vous pouvez utiliser WhatsIsMyIP pour rechercher votre adresse IP.

import random, os
from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.rdbms.mysql_flexibleservers import MySQLManagementClient
from azure.mgmt.rdbms.mysql_flexibleservers.models import Server, ServerVersion

# Acquire a credential object using CLI-based authentication.
credential = DefaultAzureCredential()

# Retrieve subscription ID from environment variable
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

# Constants we need in multiple places: the resource group name and the region
# in which we provision resources. You can change these values however you want.
RESOURCE_GROUP_NAME = 'PythonAzureExample-DB-rg'
LOCATION = "southcentralus"

# Step 1: Provision the resource group.
resource_client = ResourceManagementClient(credential, subscription_id)

rg_result = resource_client.resource_groups.create_or_update(RESOURCE_GROUP_NAME,
    { "location": LOCATION })

print(f"Provisioned resource group {rg_result.name}")

# For details on the previous code, see Example: Provision a resource group
# at https://docs.microsoft.com/azure/developer/python/azure-sdk-example-resource-group


# Step 2: Provision the database server

# We use a random number to create a reasonably unique database server name.
# If you've already provisioned a database and need to re-run the script, set
# the DB_SERVER_NAME environment variable to that name instead.
#
# Also set DB_USER_NAME and DB_USER_PASSWORD variables to avoid using the defaults.

db_server_name = os.environ.get("DB_SERVER_NAME", f"python-azure-example-mysql-{random.randint(1,100000):05}")
db_admin_name = os.environ.get("DB_ADMIN_NAME", "azureuser")
db_admin_password = os.environ.get("DB_ADMIN_PASSWORD", "ChangePa$$w0rd24")

# Obtain the management client object
mysql_client = MySQLManagementClient(credential, subscription_id)

# Provision the server and wait for the result
poller = mysql_client.servers.begin_create(RESOURCE_GROUP_NAME,
    db_server_name, 
    Server(
        location=LOCATION,
        administrator_login=db_admin_name,
        administrator_login_password=db_admin_password,
        version=ServerVersion.FIVE7
    )
)

server = poller.result()

print(f"Provisioned MySQL server {server.name}")

# Step 3: Provision a firewall rule to allow the local workstation to connect

RULE_NAME = "allow_ip"
ip_address = os.environ["PUBLIC_IP_ADDRESS"]

# For the above code, create an environment variable named PUBLIC_IP_ADDRESS that
# contains your workstation's public IP address as reported by a site like
# https://whatismyipaddress.com/.

# Provision the rule and wait for completion
poller = mysql_client.firewall_rules.begin_create_or_update(RESOURCE_GROUP_NAME,
    db_server_name, RULE_NAME, 
    { "start_ip_address": ip_address, "end_ip_address": ip_address }  
)

firewall_rule = poller.result()

print(f"Provisioned firewall rule {firewall_rule.name}")


# Step 4: Provision a database on the server

db_name = os.environ.get("DB_NAME", "example-db1")
 
poller = mysql_client.databases.begin_create_or_update(RESOURCE_GROUP_NAME,
    db_server_name, db_name, {})

db_result = poller.result()

print(f"Provisioned MySQL database {db_result.name} with ID {db_result.id}")

Authentification dans le code

Plus loin dans cet article, vous vous connectez à Azure avec Azure CLI pour exécuter l’exemple de code. Si votre compte dispose des autorisations nécessaires pour créer des groupes de ressources et des ressources de stockage dans votre abonnement Azure, le code s’exécute correctement.

Pour utiliser ce type de code dans un script de production, vous pouvez définir des variables d’environnement pour utiliser une méthode basée sur un principal de service pour l’authentification. Pour plus d’informations, consultez Comment authentifier des applications Python avec les services Azure. Vous devez vous assurer que le principal de service dispose des autorisations suffisantes pour créer des groupes de ressources et des ressources de stockage dans votre abonnement en lui attribuant un rôle approprié dans Azure. Par exemple, le rôle Contributeur sur votre abonnement.

Pour le serveur de base de données PostreSQL, consultez :

4 : Exécuter le script

  1. Si ce n’est déjà fait, connectez-vous à Azure à l’aide d’Azure CLI :

    az login
    
  2. Définissez les variables d’environnement et PUBLIC_IP_ADDRESS les variables d’environnementAZURE_SUBSCRIPTION_ID. Vous pouvez exécuter la commande az account show pour obtenir votre ID d’abonnement à partir de la id propriété dans la sortie. Vous pouvez utiliser WhatsIsMyIP pour rechercher votre adresse IP.

    set AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000
    set PUBLIC_IP_ADDRESS=<Your public IP address>
    
  3. Si vous le souhaitez, définissez les DB_SERVER_NAMEvariables , DB_ADMIN_NAMEet DB_ADMIN_PASSWORD les variables d’environnement ; sinon, les valeurs par défaut du code sont utilisées.

  4. Exécutez le script :

    python provision_db.py
    

5 : Insérer un enregistrement et interroger la base de données

Créez un fichier nommé use_db.py avec le code suivant. Notez les dépendances sur les variables d’environnement et DB_ADMIN_NAMEDB_ADMIN_PASSWORD les variables d’environnementDB_SERVER_NAME. Vous obtenez ces valeurs à partir de la sortie de l’exécution du code précédent provision_db.py ou dans le code lui-même.

Ce code fonctionne uniquement pour MySQL ; vous utilisez différentes bibliothèques pour PostgreSQL.

import os
import mysql.connector

db_server_name = os.environ["DB_SERVER_NAME"]
db_admin_name = os.getenv("DB_ADMIN_NAME", "azureuser")
db_admin_password = os.getenv("DB_ADMIN_PASSWORD", "ChangePa$$w0rd24")

db_name = os.getenv("DB_NAME", "example-db1")
db_port = os.getenv("DB_PORT", 3306)

connection = mysql.connector.connect(user=db_admin_name,
    password=db_admin_password, host=f"{db_server_name}.mysql.database.azure.com",
    port=db_port, database=db_name, ssl_ca='./BaltimoreCyberTrustRoot.crt.pem')

cursor = connection.cursor()

"""
# Alternate pyodbc connection; include pyodbc in requirements.txt
import pyodbc

driver = "{MySQL ODBC 5.3 UNICODE Driver}"

connect_string = f"DRIVER={driver};PORT=3306;SERVER={db_server_name}.mysql.database.azure.com;" \
                 f"DATABASE={DB_NAME};UID={db_admin_name};PWD={db_admin_password}"

connection = pyodbc.connect(connect_string)
"""

table_name = "ExampleTable1"

sql_create = f"CREATE TABLE {table_name} (name varchar(255), code int)"

cursor.execute(sql_create)
print(f"Successfully created table {table_name}")

sql_insert = f"INSERT INTO {table_name} (name, code) VALUES ('Azure', 1)"
insert_data = "('Azure', 1)"

cursor.execute(sql_insert)
print("Successfully inserted data into table")

sql_select_values= f"SELECT * FROM {table_name}"

cursor.execute(sql_select_values)
row = cursor.fetchone()

while row:
    print(str(row[0]) + " " + str(row[1]))
    row = cursor.fetchone()

connection.commit()

Tout ce code utilise l’API mysql.connector. La seule partie spécifique à Azure est le domaine hôte complet pour le serveur MySQL (mysql.database.azure.com).

Ensuite, téléchargez le certificat nécessaire pour communiquer via TSL/SSL avec votre serveur Azure Database pour MySQL depuis https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem et enregistrez le fichier de certificat dans le même dossier que le fichier Python. Pour plus d’informations, consultez Obtenir un certificat SSL dans la documentation Azure Database pour MySQL.

Enfin, exécutez le code :

python use_db.py

Si vous voyez une erreur indiquant que votre adresse IP cliente n’est pas autorisée, case activée que vous avez correctement défini la variable PUBLIC_IP_ADDRESS d’environnement. Si vous avez déjà créé le serveur MySQL avec l’adresse IP incorrecte, vous pouvez ajouter un autre dans le Portail Azure. Dans le portail, sélectionnez le serveur MySQL, puis sélectionnez Connecter sécurité d’ion. Ajoutez l’adresse IP de votre station de travail à la liste des adresses IP autorisées.

6 : Nettoyer les ressources

Exécutez la commande az group delete si vous n’avez pas besoin de conserver le groupe de ressources et les ressources de stockage créées dans cet exemple.

Les groupes de ressources n’entraînent pas de frais continus dans votre abonnement, mais les ressources, comme les comptes de stockage, dans le groupe de ressources peuvent continuer à entraîner des frais. Il est recommandé de propre un groupe que vous n’utilisez pas activement. L’argument --no-wait permet à la commande de retourner immédiatement un résultat au lieu d’attendre que l’opération se termine.

az group delete -n PythonAzureExample-DB-rg  --no-wait

Vous pouvez également utiliser la méthode ResourceManagementClient.resource_groups.begin_delete pour supprimer un groupe de ressources du code. Le code dans l’exemple : Créer un groupe de ressources illustre l’utilisation.

Pour référence : commandes Azure CLI équivalentes

Les commandes Azure CLI suivantes effectuent la même procédure de provisionnement que le script Python. Pour une base de données PostgreSQL, utilisez az postgres flexible-server des commandes.

az group create --location southcentralus --name PythonAzureExample-DB-rg

az mysql flexible-server create --location southcentralus --resource-group PythonAzureExample-DB-rg ^
    --name python-azure-example-mysql-12345 --admin-user azureuser --admin-password ChangePa$$w0rd24 ^
    --sku-name Standard_B1ms --version 5.7 --yes

# Change the IP address to the public IP address of your workstation, that is, the address shown
# by a site like https://whatismyipaddress.com/.

az mysql flexible-server firewall-rule create --resource-group PythonAzureExample-DB-rg --name python-azure-example-mysql-12345 ^
    --rule-name allow_ip --start-ip-address 10.11.12.13 --end-ip-address 10.11.12.13

az mysql flexible-server db create --resource-group PythonAzureExample-DB-rg --server-name python-azure-example-mysql-12345 ^
    --database-name example-db1

Voir aussi