例: Azure ライブラリを使用してデータベースを作成する
この例では、Python スクリプトで Azure SDK 管理ライブラリを使用して、Azure Database for MySQL フレキシブル サーバーとデータベースを作成する方法について説明します。 また、mysql-connector ライブラリ (Azure SDK の一部ではない) を使用してデータベースに対してクエリを実行する簡単なスクリプトも提供します。 同様のコードを使用して、Azure Database for PostgreSQL フレキシブル サーバー インスタンスとデータベースを作成できます。
同等の Azure CLI コマンドについては、この記事の後半に記載されています。 Azure portal を使用する場合は、MySQL サーバーの作成または PostgreSQL サーバーの作成に関する記事を参照してください。
特に記載のない限り、この記事で使用されているコマンドはいずれも、Linux と macOS の bash および Windows のコマンド シェルで同じように動作します。
1: ローカルの開発環境を設定する
まだ行っていない場合は、このコードを実行できる環境を設定します。 次のことをお試しください。
venv
または任意のツールを使用して Python 仮想環境を構成します。 仮想環境は、ローカルまたは Azure Cloud Shell で作成し、そこでコードを実行できます。 仮想環境の使用を開始するには、必ず仮想環境をアクティブにします。Conda 環境を使用します。
Visual Studio Code または GitHub Codespaces で Dev コンテナを使用します。
2: 必要な Azure ライブラリ パッケージをインストールする
requirements.txt という名前のファイルを作成し、内容を次のようにします。
azure-mgmt-resource
azure-mgmt-rdbms
azure-identity
mysql-connector-python
仮想環境がアクティブになっているターミナルで必要なものをインストールします。
pip install -r requirements.txt
Note
Windows では、mysql ライブラリを 32 ビットの Python ライブラリにインストールしようとすると、mysql.h ファイルに関するエラーが生成されます。 この場合は、64 ビット バージョンの Python をインストールして、もう一度やり直してください。
3: データベースを作成するコードを記述する
次のコードを使用して、provision_db.py という名前の Python ファイルを作成します。 詳細はコメントで説明しています。 具体的には、AZURE_SUBSCRIPTION_ID
および PUBLIC_IP_ADDRESS
用の環境変数を指定します。 2番目の変数は、このサンプルを実行するためのワークステーションの IP アドレスです。 WhatsIsMyIP を使用すると、IP アドレスを見つけることができます。
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}")
コード内の認証
この記事の後半では、Azure CLI を使用して Azure にサインインしてサンプル コードを実行します。 Azure サブスクリプションにリソース グループとストレージ リソースを作成するアクセス許可がアカウントにある場合、コードは正常に実行されます。
運用スクリプトでこのようなコードを使用するには、認証にサービス プリンシパル ベースの方法を使用するように環境変数を設定します。 詳細については、「Azure サービスで Python アプリを認証する方法」を参照してください。 サブスクリプションの Contributor ロールなど、Azure の適切なロールを割り当てて、サブスクリプションでリソース グループやストレージ リソースを作成するための十分なアクセス許可がサービス プリンシパルにあることを確認します。
コードで使用されているクラスの参照リンク
- ResourceManagementClient (azure.mgmt.resource)
- MySQLManagementClient (azure.mgmt.rdbms.mysql_flexibleservers)
- Server (azure.mgmt.rdbms.mysql_flexibleservers.models)
- ServerVersion (azure.mgmt.rdbms.mysql_flexibleservers.models)
PostreSQL データベース サーバーについては、次を参照してください。
4: スクリプトを実行します。
実行していない場合、Azure CLI を使用して Azure にサインインします。
az login
AZURE_SUBSCRIPTION_ID
およびPUBLIC_IP_ADDRESS
の環境変数を設定します。 az account show コマンドを実行すると、出力のid
プロパティからお使いのサブスクリプション ID を取得できます。 WhatsIsMyIP を使用すると、IP アドレスを見つけることができます。必要に応じて、
DB_SERVER_NAME
、DB_ADMIN_NAME
、およびDB_ADMIN_PASSWORD
の環境変数を設定します。それ以外の場合は、コードの既定値が使用されます。次のスクリプトを実行します。
python provision_db.py
5: レコードを挿入し、データベースに対してクエリを実行する
次のコードを含む use_db.py という名前のファイルを作成します。 DB_SERVER_NAME
、DB_ADMIN_NAME
、および DB_ADMIN_PASSWORD
環境変数への依存関係に注意してください。 これらの値は、前のコード provision_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", "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()
このコードはすべて、mysql.connector API を使用します。 Azure 固有の部分は、MySQL サーバーの完全なホスト ドメイン (mysql.database.azure.com) のみです。
次に、Azure Database for MySQL サーバーと TSL/SSL 経由で通信するために必要な証明書を https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem からダウンロードし、その証明書ファイルを Python ファイルと同じフォルダーに保存します。 詳細については、Azure Database for MySQL ドキュメントの「SSL 証明書の取得」を参照します。
最後に、コードを実行します。
python use_db.py
クライアント IP アドレスが許可されないというエラーが表示される場合は、環境変数 PUBLIC_IP_ADDRESS
を正しく定義しているかを確認します。 間違った IP アドレスで MySQL サーバーを既に作成している場合は、Azure portal で別の IP アドレスを追加できます。 ポータルで MySQL サーバーを選択し、[接続のセキュリティ] を選択します。 許可される IP アドレスの一覧に使用するワークステーションの IP アドレスを追加します。
6: リソースをクリーンアップする
この例で作成したリソース グループおよびストレージ リソースを保持する必要がない場合は、az group delete コマンドを実行します。
リソース グループではサブスクリプションに継続的な料金は発生しませんが、リソース グループ内のストレージ アカウントなどのリソースには引き続き料金が発生する可能性があります。 アクティブに使用していないグループをクリーン アップすることをお勧めします。 --no-wait
引数を使用すると、操作が完了するまで待機するのではなく、直ちにコマンドから戻ることができます。
az group delete -n PythonAzureExample-DB-rg --no-wait
コードから ResourceManagementClient.resource_groups.begin_delete
メソッドを使用してリソース グループを削除することもできます。 「例: リソース グループを作成する」のコードでは、使用方法を示しています。
参考: 同等の Azure CLI コマンド
次の Azure CLI コマンドは、Python スクリプトと同じプロビジョニング手順を完了します。 PostgreSQL データベースの場合は、az postgres flexible-server
コマンドを使用します。
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