Поделиться через


Пример. Создание базы данных с помощью библиотек Azure

В этом примере показано, как использовать библиотеки управления Azure SDK для Python для программного создания гибкого сервера Базы данных Azure для MySQL и соответствующей базы данных. Он также включает в себя базовый скрипт, использующий библиотеку mysql-connector-python (не часть пакета SDK Azure) для подключения к базе данных и запроса к ней.

Этот пример можно адаптировать для создания гибкого сервера Базы данных Azure для PostgreSQL, изменив соответствующие импорты пакета SDK и вызовы API.

Если вы предпочитаете использовать Azure CLI, в этой статье приведены эквивалентные команды Azure CLI . Сведения о графическом интерфейсе см. в документации по порталу Azure:

Если иное не указано, все примеры и команды работают согласованно в оболочках команд Linux или macOS bash и Windows.

1. Настройка локальной среды разработки

Если вы еще не сделали этого, настройте среду, в которой можно запустить код. Ниже приведено несколько вариантов:

  • Настройте виртуальную среду Python с помощью venv или выбранного средства. Чтобы начать использовать виртуальную среду, обязательно активируйте ее. Сведения об установке Python см. в разделе "Установка Python".

    #!/bin/bash
    # Create a virtual environment
    python -m venv .venv
    # Activate the virtual environment
    source .venv/Scripts/activate # only required for Windows (Git Bash)
    
  • Используйте среду conda. Сведения об установке Conda см. в разделе "Установка Miniconda".

  • Используйте контейнер разработки в Visual Studio Code или GitHub Codespaces.

2. Установка необходимых пакетов библиотек Azure

На этом шаге необходимо установить библиотеки пакета SDK Azure, необходимые для создания базы данных.

  1. В консоли создайте файлrequirements.txt , в который перечислены библиотеки управления, используемые в этом примере:

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

    Замечание

    Библиотека mysql-connector-python не является частью пакета SDK Azure. Это сторонняя библиотека, которую можно использовать для подключения к базам данных MySQL. Вы также можете использовать другие библиотеки, такие как PyMySQL или SQLAlchemy, чтобы подключиться к базам данных MySQL.

  2. В консоли с активированной виртуальной средой установите требования:

    pip install -r requirements.txt
    

    Замечание

    В Windows попытка установить библиотеку mysql в 32-разрядную библиотеку Python выдает ошибку о файле mysql.h . В этом случае установите 64-разрядную версию Python и повторите попытку.

3. Установите переменные среды

На этом шаге вы устанавливаете переменные среды для использования в коде в этой статье. Код использует os.environ метод для получения значений.

#!/bin/bash
export AZURE_RESOURCE_GROUP_NAME=<ResourceGroupName> # Change to your preferred resource group name
export LOCATION=<Location> # Change to your preferred region
export AZURE_SUBSCRIPTION_ID=$(az account show --query id --output tsv)
export PUBLIC_IP_ADDRESS=$(curl -s https://api.ipify.org)
export DB_SERVER_NAME=<DB_Server_Name> # Change to your preferred DB server name
export DB_ADMIN_NAME=<DB_Admin_Name> # Change to your preferred admin name
export DB_ADMIN_PASSWORD=<DB_Admin_Passwrod> # Change to your preferred admin password
export DB_NAME=<DB_Name> # Change to your preferred database name
export DB_PORT=3306
export version=ServerVersion.EIGHT0_21

4. Написание кода для создания и настройки гибкого сервера MySQL с базой данных

На этом шаге вы создадите файл Python с именем provision_blob.py со следующим кодом. Этот скрипт Python использует библиотеки управления Azure SDK для Python для создания группы ресурсов, гибкого сервера MySQL и базы данных на этом сервере.

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"]

# Retrieve resource group name and location from environment variables
RESOURCE_GROUP_NAME = os.environ["AZURE_RESOURCE_GROUP_NAME"]
LOCATION = os.environ["LOCATION"]

# 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

# Retrieve server name, admin name, and admin password from environment variables

db_server_name = os.environ.get("DB_SERVER_NAME")
db_admin_name = os.environ.get("DB_ADMIN_NAME")
db_admin_password = os.environ.get("DB_ADMIN_PASSWORD")

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

# Provision the server and wait for the result
server_version = os.environ.get("DB_SERVER_VERSION") 

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[server_version]  # Note: dictionary-style enum access
    )
)

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"]

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

Аутентификация в коде

Далее в этой статье вы войдите в Azure с помощью Azure CLI для выполнения примера кода. Если у вашей учетной записи есть достаточные разрешения для создания групп ресурсов и ресурсов хранилища в подписке Azure, скрипт должен успешно выполняться без дополнительной настройки.

Для использования в рабочих средах мы рекомендуем выполнять аутентификацию с помощью учетной записи службы, задав соответствующие переменные среды. Такой подход обеспечивает безопасный, неинтерактивный доступ, подходящий для автоматизации. Инструкции по настройке см. в статье "Проверка подлинности приложений Python с помощью служб Azure".

Убедитесь, что субъект-служба назначена роль с соответствующими разрешениями, например роль участника на уровне подписки или группы ресурсов. Дополнительные сведения о назначении ролей см. в статье "Управление доступом на основе ролей" (RBAC) в Azure.

Сведения о сервере базы данных PostreSQL см. в статье:

5. Запуск скрипта

  1. Если вы еще не сделали этого, войдите в Azure с помощью Azure CLI:

    az login
    
  2. Запустите скрипт:

    python provision_db.py
    

    Выполнение скрипта занимает минуту или два.

6. Вставка записи и запрос базы данных

На этом шаге вы создадите таблицу в базе данных и вставьте запись. Библиотеку mysql-connector можно использовать для подключения к базе данных и выполнения команд SQL.

  1. Создайте файл с именем use_db.py со следующим кодом.

    Этот код работает только для MySQL; вы используете разные библиотеки для PostgreSQL.

    import os
    import mysql.connector
    
    db_server_name = os.environ["DB_SERVER_NAME"]
    db_admin_name = os.getenv("DB_ADMIN_NAME")
    db_admin_password = os.getenv("DB_ADMIN_PASSWORD")
    
    db_name = os.getenv("DB_NAME")
    db_port = os.getenv("DB_PORT")
    
    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()
    

    Весь этот код использует API mysql.connector. Единственная часть, относящаяся к Azure, — это полный домен узла данного сервера MySQL (mysql.database.azure.com).

  2. Затем скачайте сертификат, необходимый для обмена данными по протоколу TSL/SSL с сервером Базы данных Azure для MySQL. Дополнительные сведения см. в статье "Получение SSL-сертификата " в документации по Базе данных Azure для MySQL.

    #!/bin/bash
    # Download Baltimore CyberTrust Root certificate required for Azure MySQL SSL connections
    CERT_URL="https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem"
    CERT_FILE="BaltimoreCyberTrustRoot.crt.pem"
    echo "Downloading SSL certificate..."
    curl -o "$CERT_FILE" "$CERT_URL"
    
  3. Наконец, запустите код:

    python use_db.py
    

Если вы видите ошибку, связанную с тем, что IP-адрес вашего клиента не разрешен, убедитесь, что вы правильно определили переменную среды PUBLIC_IP_ADDRESS. Если вы уже создали сервер MySQL с неправильным IP-адресом, вы можете добавить другой на портале Azure. На портале выберите сервер MySQL и выберите безопасность подключения. Добавьте IP-адрес рабочей станции в список разрешенных IP-адресов.

7. Очистка ресурсов

Выполните команду az group delete , если вам не нужно хранить группу ресурсов и ресурсы хранилища, созданные в этом примере.

Группы ресурсов не несут никаких текущих расходов в подписке, но ресурсы, такие как учетные записи хранения, в группе ресурсов могут по-прежнему влечь за собой расходы. Рекомендуется очистить любую группу, которую вы активно не используете. Аргумент --no-wait позволяет команде немедленно вернуться, а не ожидать завершения операции.

#!/bin/bash
az group delete -n $AZURE_RESOURCE_GROUP_NAME --no-wait

Можно также использовать ResourceManagementClient.resource_groups.begin_delete метод для удаления группы ресурсов из кода. Код в примере: создание группы ресурсов демонстрирует использование.

Для справки: эквивалентные команды Azure CLI

Следующие команды Azure CLI выполняют те же действия по подготовке, что и скрипт Python. Для базы данных PostgreSQL используйте az postgres flexible-server команды.

#!/bin/bash
#!/bin/bash

# Set variables
export LOCATION=<Location> # Change to your preferred region
export AZURE_RESOURCE_GROUP_NAME=<ResourceGroupName> # Change to your preferred resource group name
export DB_SERVER_NAME=<DB_Server_Name> # Change to your preferred DB server name
export DB_ADMIN_NAME=<DB_Admin_Name> # Change to your preferred admin name
export DB_ADMIN_PASSWORD=<DB_Admin_Password> # Change to your preferred admin password
export DB_NAME=<DB_Name> # Change to your preferred database name
export DB_SERVER_VERSION="5.7"

# Get public IP address
export PUBLIC_IP_ADDRESS=$(curl -s https://api.ipify.org)

# Provision the resource group
echo "Creating resource group: $AZURE_RESOURCE_GROUP_NAME"
az group create \
    --location "$LOCATION" \
    --name "$AZURE_RESOURCE_GROUP_NAME"

# Provision the MySQL Flexible Server
echo "Creating MySQL Flexible Server: $DB_SERVER_NAME"
az mysql flexible-server create \
    --location "$LOCATION" \
    --resource-group "$AZURE_RESOURCE_GROUP_NAME" \
    --name "$DB_SERVER_NAME" \
    --admin-user "$DB_ADMIN_NAME" \
    --admin-password "$DB_ADMIN_PASSWORD" \
    --sku-name Standard_B1ms \
    --version "$DB_SERVER_VERSION" \
    --yes

# Provision a firewall rule to allow access from the public IP address
echo "Creating firewall rule for public IP: $PUBLIC_IP_ADDRESS"
az mysql flexible-server firewall-rule create \
    --resource-group "$AZURE_RESOURCE_GROUP_NAME" \
    --name "$DB_SERVER_NAME" \
    --rule-name allow_ip \
    --start-ip-address "$PUBLIC_IP_ADDRESS" \
    --end-ip-address "$PUBLIC_IP_ADDRESS"

# Provision the database
echo "Creating database: $DB_NAME"
az mysql flexible-server db create \
    --resource-group "$AZURE_RESOURCE_GROUP_NAME" \
    --server-name "$DB_SERVER_NAME" \
    --database-name "$DB_NAME"

echo "MySQL Flexible Server and database created successfully."

См. также