この例では、Azure SDK for Python 管理ライブラリを使用して、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 ライブラリをインストールします。
コンソールで、次の例で使用する管理ライブラリを一覧表示する requirements.txt ファイルを作成します。
azure-mgmt-resource azure-mgmt-rdbms azure-identity mysql-connector-python
注
mysql-connector-python
ライブラリは Azure SDK の一部ではありません。 これは、MySQL データベースへの接続に使用できるサードパーティのライブラリです。PyMySQL
やSQLAlchemy
などの他のライブラリを使用して、MySQL データベースに接続することもできます。仮想環境がアクティブ化された本体に、次の要件をインストールします。
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 フレキシブル サーバーを作成して構成するコードを記述する
この手順では、次のコードを使用 して、provision_blob.py という名前の Python ファイルを作成します。 この Python スクリプトでは、Azure SDK for 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 CLI を使用して Azure にサインインしてサンプル コードを実行します。 アカウントに、Azure サブスクリプションでリソース グループとストレージ リソースを作成するための十分なアクセス許可がある場合、スクリプトは追加の構成なしで正常に実行されます。
運用環境で使用する場合は、適切な環境変数を設定してサービス プリンシパルで認証することをお勧めします。 このアプローチにより、自動化に適した安全で非対話型のアクセスが可能になります。 セットアップ手順については、 Azure サービスで Python アプリを認証する方法に関するページを参照してください。
サブスクリプションまたはリソース グループ レベルの共同作成者ロールなど、適切なアクセス許可を持つロールがサービス プリンシパルに割り当てられていることを確認します。 ロールの割り当ての詳細については、 Azure でのロールベースのアクセス制御 (RBAC) に関するページを参照してください。
コードで使用されるクラスの参照リンク
- ResourceManagementClient (azure.mgmt.resource)
- MySQLManagementClient (azure.mgmt.rdbms.mysql_flexibleservers)
- サーバー (azure.mgmt.rdbms.mysql_flexibleservers.models)
- ServerVersion (azure.mgmt.rdbms.mysql_flexibleservers.models)
PostreSQL データベース サーバーについては、次を参照してください。
5: スクリプトを実行する
まだサインインしていない場合は、Azure CLI を使用して Azure にサインインします。
az login
次のスクリプトを実行します。
python provision_db.py
スクリプトの完了には 1 ~ 2 分かかります。
6: レコードを挿入してデータベースにクエリを実行する
この手順では、データベースにテーブルを作成し、レコードを挿入します。 mysql-connector ライブラリを使用してデータベースに接続し、SQL コマンドを実行できます。
次のコードを使用 して、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) の完全なホスト ドメインのみです。
次に、TSL/SSL 経由で Azure Database for MySQL サーバーと通信するために必要な証明書をダウンロードします。 詳細については、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"
最後に、次のコードを実行します。
python use_db.py
クライアント IP アドレスが許可されていないというエラーが表示された場合は、環境変数 PUBLIC_IP_ADDRESS
正しく定義していることを確認してください。 間違った IP アドレスで MySQL サーバーを既に作成している場合は、 Azure portal で別の IP アドレスを追加できます。 ポータルで 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."