Bagikan melalui


Contoh: Menggunakan pustaka Azure untuk membuat database

Contoh ini menunjukkan cara menggunakan pustaka manajemen Azure SDK for Python untuk membuat server fleksibel Azure Database for MySQL secara terprogram dan database yang sesuai. Ini juga mencakup skrip dasar yang menggunakan pustaka mysql-connector-python (bukan bagian dari Azure SDK) untuk menyambungkan dan mengkueri database.

Anda dapat menyesuaikan contoh ini untuk membuat server fleksibel Azure Database for PostgreSQL dengan memodifikasi impor SDK dan panggilan API yang relevan.

Jika Anda lebih suka menggunakan Azure CLI, perintah Azure CLI yang setara disediakan nanti di artikel ini. Untuk pengalaman grafis, lihat dokumentasi portal Microsoft Azure:

Kecuali ditentukan lain, semua contoh dan perintah berfungsi secara konsisten di seluruh shell perintah Linux/macOS bash dan Windows.

1: Menyiapkan lingkungan pengembangan lokal Anda

Jika Anda belum melakukannya, siapkan lingkungan tempat Anda dapat menjalankan kode. Berikut adalah beberapa opsi:

  • Konfigurasikan lingkungan virtual Python menggunakan venv atau alat pilihan Anda. Untuk mulai menggunakan lingkungan virtual, pastikan untuk mengaktifkannya. Untuk menginstal python, lihat Menginstal 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)
    
  • Gunakan lingkungan conda. Untuk menginstal Conda, lihat Menginstal Miniconda.

  • Gunakan Dev Container di Visual Studio Code atau GitHub Codespaces.

2: Menginstal paket pustaka Azure yang diperlukan

Dalam langkah ini, Anda menginstal pustaka Azure SDK yang diperlukan untuk membuat database.

  1. Di konsol Anda, buat file requirements.txt yang mencantumkan pustaka manajemen yang digunakan dalam contoh ini:

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

    Nota

    Pustaka mysql-connector-python bukan bagian dari Azure SDK. Ini adalah pustaka pihak ketiga yang dapat Anda gunakan untuk menyambungkan ke database MySQL. Anda juga dapat menggunakan pustaka lain, seperti PyMySQL atau SQLAlchemy, untuk menyambungkan ke database MySQL.

  2. Di konsol Anda dengan lingkungan virtual diaktifkan, instal persyaratan:

    pip install -r requirements.txt
    

    Nota

    Di Windows, mencoba menginstal pustaka mysql ke pustaka Python 32-bit menghasilkan kesalahan tentang file mysql.h . Dalam hal ini, instal Python versi 64-bit dan coba lagi.

3. Atur variabel lingkungan

Dalam langkah ini, Anda mengatur variabel lingkungan untuk digunakan dalam kode dalam artikel ini. Kode menggunakan os.environ metode untuk mengambil nilai.

#!/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: Menulis kode untuk membuat dan mengonfigurasi Server Fleksibel MySQL dengan database

Dalam langkah ini, Anda membuat file Python bernama provision_blob.py dengan kode berikut. Skrip Python ini menggunakan Azure SDK untuk pustaka manajemen Python untuk membuat grup sumber daya, server fleksibel MySQL, dan database di server tersebut.

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

Autentikasi dalam kode

Kemudian dalam artikel ini, Anda masuk ke Azure menggunakan Azure CLI untuk menjalankan kode sampel. Jika akun Anda memiliki izin yang memadai untuk membuat grup sumber daya dan sumber daya penyimpanan di langganan Azure Anda, skrip harus berjalan dengan sukses tanpa konfigurasi tambahan.

Untuk digunakan di lingkungan produksi, kami sarankan Anda mengautentikasi dengan perwakilan layanan dengan mengatur variabel lingkungan yang sesuai. Pendekatan ini memungkinkan akses aman dan non-interaktif yang cocok untuk otomatisasi. Untuk instruksi penyiapan, lihat Cara mengautentikasi aplikasi Python dengan layanan Azure.

Pastikan perwakilan layanan diberi peran dengan izin yang memadai—seperti peran Kontributor di tingkat grup langganan atau sumber daya. Untuk detail tentang menetapkan peran, lihat Kontrol akses berbasis peran (RBAC) di Azure.

Untuk server database PostreSQL, lihat:

5: Jalankan skrip

  1. Jika Anda belum melakukannya, masuk ke Azure menggunakan Azure CLI:

    az login
    
  2. Jalankan skrip:

    python provision_db.py
    

    Skrip membutuhkan waktu satu atau dua menit untuk diselesaikan.

6: Menyisipkan rekaman dan mengkueri database

Dalam langkah ini, Anda membuat tabel di database dan menyisipkan rekaman. Anda dapat menggunakan pustaka mysql-connector untuk menyambungkan ke database dan menjalankan perintah SQL.

  1. Buat file bernama use_db.py dengan kode berikut.

    Kode ini hanya berfungsi untuk MySQL; Anda menggunakan pustaka yang berbeda untuk 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()
    

    Semua kode ini menggunakan mysql.connector API. Satu-satunya bagian khusus Azure adalah domain host lengkap untuk server MySQL (mysql.database.azure.com).

  2. Selanjutnya, unduh sertifikat yang diperlukan untuk berkomunikasi melalui TSL/SSL dengan server Azure Database for MySQL Anda. Untuk informasi selengkapnya, lihat Mendapatkan Sertifikat SSL di dokumentasi Azure Database for 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. Terakhir, jalankan kode:

    python use_db.py
    

Jika Anda melihat kesalahan bahwa alamat IP klien Anda tidak diizinkan, periksa apakah Anda menentukan variabel PUBLIC_IP_ADDRESS lingkungan dengan benar. Jika Anda sudah membuat server MySQL dengan alamat IP yang salah, Anda dapat menambahkan yang lain di portal Microsoft Azure. Di portal, pilih server MySQL, lalu pilih Keamanan koneksi. Tambahkan alamat IP stasiun kerja Anda ke daftar alamat IP yang diizinkan.

7: Membersihkan sumber daya

Jalankan perintah az group delete jika Anda tidak perlu menyimpan grup sumber daya dan sumber daya penyimpanan yang dibuat dalam contoh ini.

Grup sumber daya tidak dikenakan biaya berkelanjutan dalam langganan Anda, tetapi sumber daya, seperti akun penyimpanan, dalam grup sumber daya mungkin terus dikenakan biaya. Ini adalah praktik yang baik untuk membersihkan grup apa pun yang tidak Anda gunakan secara aktif. Argumen --no-wait memungkinkan perintah untuk segera kembali alih-alih menunggu operasi selesai.

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

Anda juga dapat menggunakan metode ResourceManagementClient.resource_groups.begin_delete untuk menghapus grup sumber daya dari kode. Kode dalam Contoh: Membuat grup sumber daya menampilkan penggunaannya.

Untuk referensi: perintah Azure CLI yang setara

Perintah Azure CLI berikut menyelesaikan langkah-langkah provisi yang sama dengan skrip Python. Untuk database PostgreSQL, gunakan az postgres flexible-server perintah.

#!/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."

Lihat juga