Contoh: Menggunakan pustaka Azure untuk membuat database

Contoh ini menunjukkan cara menggunakan pustaka manajemen Azure SDK dalam skrip Python untuk membuat instans dan database server fleksibel Azure Database for MySQL. Ini juga menyediakan skrip sederhana untuk mengkueri database menggunakan pustaka konektor mysql (bukan bagian dari Azure SDK). Anda dapat menggunakan kode serupa untuk membuat instans dan database server fleksibel Azure Database for PostgreSQL.

Perintah Azure CLI yang setara tersedia nanti di artikel ini. Jika Anda lebih suka menggunakan portal Azure, lihat Membuat server MySQL atau Membuat server PostgreSQL.

Semua perintah dalam artikel ini bekerja secara sama di bash Linux/macOS dan shell perintah Windows kecuali ada catatan.

1: Siapkan lingkungan pengembangan lokal Anda

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

2: Instal paket pustaka Azure yang diperlukan

Buat file bernama requirements.txt dengan konten berikut:

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

Di terminal dengan lingkungan virtual diaktifkan, instal persyaratan:

pip install -r requirements.txt

Catatan

Pada 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: Menulis kode untuk membuat database

Buat file Python bernama provision_db.py dengan kode berikut. Komentar akan menjelaskan detailnya. Secara khusus, tentukan variabel lingkungan untuk AZURE_SUBSCRIPTION_ID dan PUBLIC_IP_ADDRESS. Variabel terakhir adalah alamat IP stasiun kerja Anda agar sampel ini dapat dijalankan. Anda dapat menggunakan WhatsIsMyIP untuk menemukan alamat IP Anda.

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

Autentikasi dalam kode

Kemudian dalam artikel ini, Anda masuk ke Azure dengan Azure CLI untuk menjalankan kode sampel. Jika akun Anda memiliki izin untuk membuat grup sumber daya dan sumber daya penyimpanan di langganan Azure Anda, kode akan berhasil dijalankan.

Untuk menggunakan kode tersebut dalam skrip produksi, Anda dapat mengatur variabel lingkungan untuk menggunakan metode berbasis perwakilan layanan untuk autentikasi. Untuk mempelajari selengkapnya, lihat Cara mengautentikasi aplikasi Python dengan layanan Azure. Anda perlu memastikan bahwa perwakilan layanan memiliki izin yang memadai untuk membuat grup sumber daya dan sumber daya penyimpanan dalam langganan Anda dengan menetapkan peran yang sesuai di Azure; misalnya, peran Kontributor pada langganan Anda.

Untuk server database PostreSQL, lihat:

4: Jalankan skrip

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

    az login
    
  2. Atur AZURE_SUBSCRIPTION_ID variabel lingkungan dan PUBLIC_IP_ADDRESS . Anda dapat menjalankan perintah az account show untuk mendapatkan ID langganan Anda dari id properti dalam output. Anda dapat menggunakan WhatsIsMyIP untuk menemukan alamat IP Anda.

    set AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000
    set PUBLIC_IP_ADDRESS=<Your public IP address>
    
  3. Secara opsional, atur DB_SERVER_NAMEvariabel lingkungan , DB_ADMIN_NAME, dan DB_ADMIN_PASSWORD ; jika tidak, default kode digunakan.

  4. Jalankan skrip:

    python provision_db.py
    

5: Menyisipkan catatan dan kueri database

Buat file bernama use_db.py dengan kode berikut. Perhatikan dependensi pada DB_SERVER_NAMEvariabel lingkungan , , DB_ADMIN_NAMEdan DB_ADMIN_PASSWORD . Anda mendapatkan nilai-nilai ini dari output menjalankan kode sebelumnya provision_db.py atau dalam kode itu sendiri.

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", "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()

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

Selanjutnya, unduh sertifikat yang diperlukan untuk berkomunikasi melalui TSL/SSL dengan server Azure Database for MySQL Anda dari https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem dan simpan file sertifikat ke folder yang sama dengan file Python. Untuk informasi selengkapnya, lihat Mendapatkan Sertifikat SSL di dokumentasi Azure Database for MySQL.

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 Azure. Di portal, pilih server MySQL, lalu pilih keamanan Koneksi ion. Tambahkan alamat IP stasiun kerja Anda ke daftar alamat IP yang diizinkan.

6: 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.

az group delete -n PythonAzureExample-DB-rg  --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 menunjukkan penggunaan.

Untuk referensi: perintah Azure CLI yang setara

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

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

Lihat juga