다음을 통해 공유


예: Azure 라이브러리를 사용하여 데이터베이스 만들기

이 예제에서는 Python용 Azure SDK 관리 라이브러리를 사용하여 프로그래밍 방식으로 Azure Database for MySQL 유연한 서버 및 해당 데이터베이스를 만드는 방법을 보여 줍니다. 또한 mysql-connector-python 라이브러리(Azure SDK의 일부가 아님)를 사용하여 데이터베이스에 연결하고 쿼리하는 기본 스크립트도 포함되어 있습니다.

관련 SDK 가져오기 및 API 호출을 수정하여 Azure Database for PostgreSQL 유연한 서버를 만들도록 이 예제를 조정할 수 있습니다.

Azure CLI를 사용하려는 경우 이 문서의 뒷부분에 해당하는 Azure CLI 명령 이 제공됩니다. 그래픽 환경은 Azure Portal 설명서를 참조하세요.

달리 지정하지 않는 한 모든 예제와 명령은 Linux/macOS bash 및 Windows 명령 셸에서 일관되게 작동합니다.

1: 로컬 개발 환경 설정

아직 실행하지 않은 경우 코드를 실행할 수 있는 환경을 설정합니다. 몇 가지 옵션은 다음과 같습니다.

  • 선택한 도구를 사용하거나 venv, Python 가상 환경을 구성합니다. 가상 환경 사용을 시작하려면 가상 환경을 활성화해야 합니다. 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 라이브러리 패키지 설치

이 단계에서는 데이터베이스를 만드는 데 필요한 Azure SDK 라이브러리를 설치합니다.

  1. 콘솔에서 이 예제에 사용된 관리 라이브러리를 나열하는 requirements.txt 파일을 만듭니다.

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

    비고

    라이브러리는 mysql-connector-python Azure SDK의 일부가 아닙니다. MySQL 데이터베이스에 연결하는 데 사용할 수 있는 타사 라이브러리입니다. 다른 라이브러리(예: PyMySQL 또는 SQLAlchemy)를 사용하여 MySQL 데이터베이스에 연결할 수도 있습니다.

  2. 가상 환경이 활성화된 콘솔에서 요구 사항을 설치합니다.

    pip install -r requirements.txt
    

    비고

    Windows에서 32비트 Python 라이브러리에 mysql 라이브러리를 설치하려고 시도하면 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 유연한 서버를 만들고 구성하는 코드 작성

이 단계에서는 다음 코드를 사용하여 provision_blob.py 이라는 Python 파일을 만듭니다. 이 Python 스크립트는 Python용 Azure SDK 관리 라이브러리를 사용하여 리소스 그룹, 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 CLI를 사용하여 Azure에 로그인하여 샘플 코드를 실행합니다. 계정에 Azure 구독에서 리소스 그룹 및 스토리지 리소스를 만들 수 있는 충분한 권한이 있는 경우 스크립트는 추가 구성 없이 성공적으로 실행되어야 합니다.

프로덕션 환경에서 사용하려면 적절한 환경 변수를 설정하여 서비스 주체로 인증하는 것이 좋습니다. 이 방법을 사용하면 자동화에 적합한 안전한 비대화형 액세스를 사용할 수 있습니다. 설정 지침은 Azure 서비스를 사용하여 Python 앱을 인증하는 방법을 참조하세요.

서비스 주체에게 구독 또는 리소스 그룹 수준에서 기여자 역할과 같은 적절한 권한이 있는 역할이 할당되었는지 확인합니다. 역할 할당에 대한 자세한 내용은 Azure의 RBAC(역할 기반 액세스 제어)를 참조하세요.

PostreSQL 데이터베이스 서버는 다음을 참조하세요.

5: 스크립트 실행

  1. 아직 로그인하지 않은 경우 Azure CLI를 사용하여 Azure에 로그인합니다.

    az login
    
  2. 스크립트를 실행합니다.

    python provision_db.py
    

    스크립트를 완료하는 데 1~2분이 걸립니다.

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

이 단계에서는 데이터베이스에 테이블을 만들고 레코드를 삽입합니다. mysql 커넥터 라이브러리를 사용하여 데이터베이스에 연결하고 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()
    

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

  2. 다음으로, Azure Database for MySQL 서버와 TSL/SSL을 통해 통신하는 데 필요한 인증서를 다운로드합니다. 자세한 내용은 Azure Database for MySQL 설명서에서 SSL 인증서 가져오기 를 참조하세요.

    #!/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 를 올바르게 정의했는지 확인합니다. 잘못된 IP 주소로 MySQL 서버를 이미 만든 경우 Azure Portal에서 다른 서버를 추가할 수 있습니다. 포털에서 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."

참고하십시오