Beispiel: Verwenden der Azure-Bibliotheken zum Erstellen einer Datenbank

In diesem Beispiel wird veranschaulicht, wie Sie die Azure SDK-Verwaltungsbibliotheken in einem Python-Skript verwenden, um eine Azure-Datenbank für flexible Serverinstanz und -datenbank für MySQL zu erstellen. Darüber hinaus finden Sie hier ein einfaches Skript zum Abfragen der Datenbank unter Verwendung der Bibliothek „mysql-connector“ (nicht im Azure SDK enthalten). Sie können einen ähnlichen Code verwenden, um eine Azure-Datenbank für flexible Serverinstanz und -datenbank für PostgreSQL zu erstellen.

Entsprechende Azure CLI-Befehle finden Sie weiter unten in diesem Artikel. Wenn Sie die Azure-Portal verwenden möchten, lesen Sie "Erstellen eines MySQL-Servers" oder "Erstellen eines PostgreSQL-Servers".

Alle Befehle in diesem Artikel funktionieren in Linux-/macOS-Bash- und Windows-Befehlsshells identisch, sofern nicht anders angegeben.

1: Einrichten Ihrer lokalen Entwicklungsumgebung

Falls noch nicht geschehen, richten Sie eine Umgebung ein, in der Sie den Code ausführen können. Hier einige Optionen:

2: Installieren der erforderlichen Azure-Bibliothekspakete

Erstellen Sie eine Datei namens requirements.txt mit folgendem Inhalt:

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

Installieren Sie in einem Terminal mit aktivierter virtueller Umgebung die Anforderungen:

pip install -r requirements.txt

Hinweis

Wenn Sie unter Windows versuchen, die MySQL-Bibliothek in einer 32-Bit-Python-Bibliothek zu installieren, tritt ein Fehler für die Datei mysql.h auf. Installieren Sie in diesem Fall eine 64-Bit-Version von Python, und versuchen Sie es noch mal.

3: Schreiben von Code zum Erstellen der Datenbank

Erstellen Sie eine Python-Datei mit dem Namen provision_db.py und dem folgenden Code. Die Details werden in den Kommentaren erläutert: Geben Sie insbesondere Umgebungsvariablen für AZURE_SUBSCRIPTION_ID und PUBLIC_IP_ADDRESS. Letztere Variable ist die IP-Adresse Ihrer Arbeitsstation, damit dieses Beispiel ausgeführt werden kann. Sie können WhatsIsMyIP verwenden, um Ihre IP-Adresse zu finden.

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}")

Authentifizierung im Code

Später in diesem Artikel melden Sie sich mit der Azure CLI bei Azure an, um den Beispielcode auszuführen. Wenn Ihr Konto über Berechtigungen zum Erstellen von Ressourcengruppen und Speicherressourcen in Ihrem Azure-Abonnement verfügt, wird der Code erfolgreich ausgeführt.

Um diesen Code in einem Produktionsskript zu verwenden, können Sie Umgebungsvariablen so festlegen, dass eine dienstprinzipalbasierte Methode für die Authentifizierung verwendet wird. Weitere Informationen finden Sie unter Authentifizieren von Python-Apps mit Azure-Diensten. Sie müssen sicherstellen, dass der Dienstprinzipal über ausreichende Berechtigungen zum Erstellen von Ressourcengruppen und Speicherressourcen in Ihrem Abonnement verfügt, indem Sie ihm eine entsprechende Rolle in Azure zuweisen, z. B. die Rolle "Mitwirkender " in Ihrem Abonnement.

Informationen zum PostreSQL-Datenbankserver finden Sie unter:

4: Ausführen des Skripts

  1. Falls noch nicht geschehen, melden Sie sich mit der Azure CLI bei Azure an:

    az login
    
  2. Legen Sie die AZURE_SUBSCRIPTION_ID Variablen und PUBLIC_IP_ADDRESS Umgebungsvariablen fest. Sie können den Befehl "az account show" ausführen, um Ihre Abonnement-ID aus der Eigenschaft in der id Ausgabe abzurufen. Sie können WhatsIsMyIP verwenden, um Ihre IP-Adresse zu finden.

    set AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000
    set PUBLIC_IP_ADDRESS=<Your public IP address>
    
  3. Legen Sie optional die DB_SERVER_NAMEVariablen und DB_ADMIN_NAMEDB_ADMIN_PASSWORD Umgebungsvariablen fest. Andernfalls werden Codestandardwerte verwendet.

  4. Ausführen des Skripts:

    python provision_db.py
    

5: Einfügen eines Datensatzes und Abfragen der Datenbank

Erstellen Sie eine Datei namens use_db.py mit folgendem Code. Beachten Sie die Abhängigkeiten von den DB_SERVER_NAMEVariablen ,, DB_ADMIN_NAMEund DB_ADMIN_PASSWORD Umgebungsvariablen. Sie erhalten diese Werte aus der Ausgabe der Ausführung des vorherigen Codes provision_db.py oder im Code selbst.

Dieser Code funktioniert nur für MySQL; Sie verwenden unterschiedliche Bibliotheken für 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()

In diesem Code wird die API „mysql.connector“ verwendet. Der einzige Azure-spezifische Teil ist die vollständige Hostdomäne für den MySQL-Server (mysql.database.azure.com).

Laden Sie als Nächstes das Zertifikat herunter, das für die Kommunikation über TSL/SSL mit Ihrer Azure-Datenbank für MySQL-Server https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem erforderlich ist, und speichern Sie die Zertifikatdatei im selben Ordner wie die Python-Datei. Weitere Informationen finden Sie unter Abrufen eines SSL-Zertifikats in der Azure-Datenbank für MySQL-Dokumentation.

Führen Sie schließlich den Code aus:

python use_db.py

Wenn ein Fehler angezeigt wird, dass Ihre Client-IP-Adresse nicht zulässig ist, überprüfen Sie, ob Sie die Umgebungsvariable richtig definiert haben PUBLIC_IP_ADDRESS . Wenn Sie den MySQL-Server bereits mit der falschen IP-Adresse erstellt haben, können Sie eine weitere in der Azure-Portal hinzufügen. Wählen Sie im Portal den MySQL-Server und dann Verbinden ion Sicherheit aus. Fügen Sie die IP-Adresse Ihrer Arbeitsstation zur Liste der zulässigen IP-Adressen hinzu.

6: Ressourcen bereinigen

Führen Sie den Befehl "az group delete " aus, wenn Sie die in diesem Beispiel erstellte Ressourcengruppe und Speicherressourcen nicht beibehalten müssen.

Ressourcengruppen verursachen keine laufenden Gebühren in Ihrem Abonnement, aber Ressourcen wie Speicherkonten in der Ressourcengruppe verursachen möglicherweise weiterhin Gebühren. Es empfiehlt sich, jede Gruppe zu sauber, die Sie nicht aktiv verwenden. Das Argument --no-wait ermöglicht die direkte Rückgabe des Befehls, und es muss nicht auf den Abschluss des Vorgangs gewartet werden.

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

Sie können auch die ResourceManagementClient.resource_groups.begin_delete-Methode verwenden, um eine Ressourcengruppe aus dem Code zu löschen. Der Code im Beispiel: Erstellen einer Ressourcengruppe veranschaulicht die Verwendung.

Zur Referenz: äquivalente Azure CLI-Befehle

Mit den folgenden Azure CLI-Befehlen können die gleichen Bereitstellungsschritte ausgeführt werden wie mit dem Python-Skript. Verwenden Sie az postgres flexible-server für eine PostgreSQL-Datenbank Befehle.

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

Weitere Informationen