Partager via


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

Cet exemple démontre comment utiliser les bibliothèques de gestion Azure SDK dans un script Python pour créer une instance et une base de données Azure Database pour MySQL flexible server. 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 un code similaire pour créer une instance et une base de données Azure Database pour PostgreSQL flexible server.

Les commandes équivalentes Azure CLI se trouvent plus loin dans cet article. Si vous préférez utiliser le portail Azure, veuillez consulter 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 : Configurez votre environnement de développement local

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

2 : Installez les packages de bibliothèques 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 exigences :

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 : Écrivez 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 les variables d’environnement pour AZURE_SUBSCRIPTION_ID et PUBLIC_IP_ADDRESS. La dernière variable est l’adresse IP de votre poste de travail pour que cet exemple fonctionne. Vous pouvez utiliser WhatsIsMyIP pour trouver 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 connecterez à Azure avec l’Azure CLI pour exécuter le code d’exemple. Si votre compte dispose des autorisations pour créer des groupes de ressources et des ressources de stockage dans votre abonnement Azure, le code s’exécutera avec succès.

Pour utiliser un tel code dans un script de production, vous pouvez définir des variables d’environnement pour utiliser une méthode d’authentification basée sur un principal de service. Pour en savoir plus, veuillez consulter la section Comment authentifier les 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 PostgreSQL, consultez :

4 : Exécutez le script.

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

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

    set AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000
    set PUBLIC_IP_ADDRESS=<Your public IP address>
    
  3. Optionnellement, définissez les variables d’environnement DB_SERVER_NAME, DB_ADMIN_NAME et DB_ADMIN_PASSWORD ; sinon, les valeurs par défaut du code sont utilisées.

  4. Exécutez le script :

    python provision_db.py
    

5 : Insérez un enregistrement et interrogez 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 DB_SERVER_NAME, DB_ADMIN_NAME et DB_ADMIN_PASSWORD. 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 des bibliothèques différentes 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 for 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 for MySQL.

Enfin, exécutez le code :

python use_db.py

Si vous voyez une erreur indiquant que l’adresse IP de votre client n’est pas autorisée, vérifiez que vous avez défini correctement la variable d’environnement PUBLIC_IP_ADDRESS. Si vous avez déjà créé le serveur MySQL avec la mauvaise adresse IP, vous pouvez en ajouter une autre dans le portail Azure. Dans le portail, sélectionnez le serveur MySQL, puis sélectionnez Sécurité de la connexion. Ajoutez l’adresse IP de votre poste de travail à la liste des adresses IP autorisées.

6 : Nettoyez 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 aucun frais permanent dans votre abonnement, mais des ressources comme les comptes de stockage dans le groupe de ressources peuvent continuer à entraîner des frais. Il est conseillé de nettoyer tout 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 Exemple : Créer un groupe de ressources démontre 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 les az postgres flexible-server 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