예: Azure 라이브러리를 사용하여 데이터베이스 프로비저닝

이 예제에서는 Python 스크립트에서 Azure SDK 관리 라이브러리를 사용하여 Azure MySQL 데이터베이스를 프로비저닝하는 방법을 보여줍니다. 또한 Azure SDK의 일부가 아닌 mysql-connector 라이브러리를 사용하여 데이터베이스를 쿼리하는 간단한 스크립트를 제공합니다. (해당하는 Azure CLI 명령은 이 문서의 뒷부분에서 제공됩니다. Azure Portal 사용하려면 PostgreSQL 서버 만들기 또는 MariaDB 서버 만들기를 참조하세요.)

비슷한 코드를 사용하여 PostgreSQL 또는 MariaDB 데이터베이스를 프로비저닝할 수 있습니다.

이 문서의 모든 명령은 언급되지 않는 한 Linux/macOS bash 및 Windows 명령 셸에서 동일하게 작동합니다.

1: 로컬 개발 환경 설정

아직 수행하지 않은 경우 Azure에 대한 로컬 Python 개발 환경 구성모든 지침을 따르세요.

로컬 개발을 위한 서비스 주체를 만들고 이 프로젝트의 가상 환경을 만들어 활성화해야 합니다.

2: 필요한 Azure 라이브러리 패키지 설치

다음과 같은 콘텐츠가 포함된 requirements.txt라는 파일을 만듭니다.

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

azure-mgmt-resource에 대한 특정 버전 요구 사항은 현재 버전의 azure-mgmt-web과 호환되는 버전을 사용하는 것입니다. 이러한 버전은 azure.core를 기반으로 하지 않으므로 인증에 이전 방법을 사용합니다.

가상 환경이 활성화된 터미널 또는 명령 프롬프트에서 다음 요구 사항을 설치합니다.

pip install -r requirements.txt

참고

Windows에서 32비트 Python 라이브러리에 mysql 라이브러리를 설치하려는 경우 mysql.h 파일에 대한 오류가 생성됩니다. 이 경우 64비트 버전의 Python을 설치하고 다시 시도합니다.

3: 코드를 작성하여 데이터베이스 프로비저닝

다음 코드를 사용하여 provision_db.py라는 Python 파일을 만듭니다. 주석은 세부 정보를 설명합니다.

import random, os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.rdbms.mysql import MySQLManagementClient
from azure.mgmt.rdbms.mysql.models import ServerForCreate, ServerPropertiesForDefaultCreate, ServerVersion

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

# 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 = "westus"

# 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"PythonAzureExample-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, 
    ServerForCreate(
        location=LOCATION,
        properties=ServerPropertiesForDefaultCreate(
            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}")

이 샘플을 실행하려면 워크스테이션의 IP 주소를 사용하여 PUBLIC_IP_ADDRESS라는 환경 변수를 생성해야 합니다.

이 코드는 Azure CLI에서 직접 수행할 수 있는 작업을 보여주므로 CLI 기반 인증(AzureCliCredential 사용)을 사용합니다. 두 경우 모두 인증에 동일한 ID를 사용합니다.

프로덕션 스크립트(예: VM 관리 자동화)에서 이러한 코드를 사용하려면 Azure 서비스를 사용하여 Python 앱을 인증하는 방법에 설명된 대로 (권장) 또는 서비스 주체 기반 메서드를 사용합니다 DefaultAzureCredential .

또한 참조: - PostgreSQLManagementClient (azure.mgmt.rdbms.postgresql) - MariaDBManagementClient (azure.mgmt.rdbms.mariadb)

4: 스크립트 실행

python provision_db.py

5: 레코드 삽입 및 데이터베이스 쿼리

  1. 다음 코드를 사용하여 use_db.py라는 파일을 만듭니다. 프로비저닝 코드의 값으로 채워야 하는 DB_SERVER_NAME, DB_ADMIN_NAMEDB_ADMIN_PASSWORD 환경 변수의 종속성을 기록합니다. 이 코드는 MySQL에서만 작동합니다. PostgreSQL 및 MariaDB에 대해서는 다른 라이브러리를 사용합니다.

    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=f"{db_admin_name}@{db_server_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()
    

    이 코드는 모두 mysql.connector API를 사용합니다. Azure와 관련된 유일한 부분은 MySQL 서버에 대한 전체 호스트 도메인(mysql.database.azure.com)입니다.

  2. https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem 에서 SSL을 통해 Azure Database for MySQL 서버와 통신하는 데 필요한 인증서를 다운로드하고 인증서 파일을 Python 파일과 동일한 폴더에 저장합니다. (이 단계는 Azure Database for MySQL 설명서의 SSL 인증서 가져오기에 설명되어 있습니다.)

  3. 코드를 실행합니다.

    python use_db.py
    

6: 리소스 정리

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

이 예제에서 프로비저닝된 리소스를 유지할 필요가 없으며 구독에서 지속적인 요금을 방지하려면 이 명령을 실행합니다.

ResourceManagementClient.resource_groups.begin_delete 메서드를 사용하여 코드에서 리소스 그룹을 삭제할 수도 있습니다. 예: 리소스 그룹 프로비전의 코드는 사용법을 보여줍니다.

참조용: 해당 Azure CLI 명령

다음 Azure CLI 명령은 Python 스크립트와 동일한 프로비저닝 단계를 완료합니다. PostgreSQL 데이터베이스의 경우 az postgres 명령을, MariaDB의 경우 az mariadb 명령을 사용합니다.

az group create -l centralus -n PythonAzureExample-DB-rg

az mysql server create -l westus -g PythonAzureExample-DB-rg -n PythonAzureExample-MySQL-12345 ^
    -u azureuser -p ChangePa$$w0rd24 --sku-name B_Gen5_1

# 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 server firewall-rule create -g PythonAzureExample-DB-rg --server PythonAzureExample-MySQL-12345 ^
    -n allow_ip --start-ip-address 10.11.12.13 --end-ip-address 10.11.12.13

az mysql db create -g PythonAzureExample-DB-rg --server PythonAzureExample-MySQL-12345 -n example-db1

참고 항목