スポンサーリンク
Azure

Python SDKで実現するInfrastructure as Code!Azure AI Foundry環境を自動構築しよう

Azure
この記事は約17分で読めます。

AI開発プロジェクトを始めるとき、環境の準備に時間や手間がかかっていませんか? 「この設定、前のプロジェクトではどうしたっけ…?」とドキュメントを探したり、手作業でのリソース作成でミスが発生したり…。

そんな課題を解決するのが、Infrastructure as Code (IaC) という考え方です。そして、Azureの統合AI開発プラットフォームである Azure AI Foundry (Azure AI Studio) も、Python SDKを使えばコードでスマートに環境構築ができます。

この記事では、Pythonスクリプトを元に、Azure AI Foundryの環境(AI HubとAI Project)をコードで完全に自動構築する手順をステップバイステップで解説していきます。

なぜPython SDKで構築するのか?

手動でポータルからリソースを作成するのは簡単ですが、コード化にはそれを上回るメリットがあります。

  • 再現性: 誰が実行しても、何度実行しても、全く同じ環境を正確に構築できます。
  • バージョン管理: gitなどでインフラの構成を管理でき、変更履歴の追跡やチームでの共同作業が容易になります。
  • 自動化: CI/CDパイプラインに組み込むことで、環境構築からデプロイまでの一連の流れを自動化できます。

それでは、さっそく準備から始めていきましょう!

準備するもの

スクリプトを実行する前に、以下の準備を整えておきましょう。

  • Azure サブスクリプション: もちろん、Azureのアカウントが必要です。
  • Python環境: Python 3.8以上がインストールされている環境。
  • Azure CLI: Azureと対話するためのコマンドラインツール。az loginでログインしておいてください。

必要なPythonライブラリ: スクリプトで使われているライブラリをインストールします。

pip install azure-ai-ml azure-identity azure-mgmt-storage azure-mgmt-keyvault python-dotenv pyjwt
  • .env ファイル: スクリプトと同じ階層に.envというファイルを作成し、環境変数を設定します。これにより、コード内に秘密情報を直接書き込むのを避けられます。
AZURE_SUBSCRIPTION_ID="<サブスクリプションID>"
AZURE_RESOURCE_GROUP_NAME="<リソースグループ名>"
AZURE_AI_FOUNDRY_HUB_NAME="<作成したいAI Hubの名前>"
AZURE_AI_PROJECT_NAME="<作成したいAI Projectの名前>"
AZURE_STORAGE_ACCOUNT_NAME="<ユニークなストレージアカウント名>"
AZURE_KEY_VAULT_NAME="<ユニークなKey Vault名>"

コードの全体像

import os
from dotenv import load_dotenv
import jwt

from azure.identity import DefaultAzureCredential
from azure.ai.ml import MLClient
# Hub と Project の両方をインポートする
from azure.ai.ml.entities import Hub, Project

# 各リソースを管理するためのクライアントをインポート
from azure.mgmt.storage import StorageManagementClient
from azure.mgmt.keyvault import KeyVaultManagementClient
from azure.mgmt.keyvault.models import VaultCreateOrUpdateParameters, Sku, VaultProperties, AccessPolicyEntry, Permissions

# .envファイルから環境変数を読み込みます
load_dotenv()

# --- 設定値 ---
subscription_id = os.getenv("AZURE_SUBSCRIPTION_ID")
resource_group_name = os.getenv("AZURE_RESOURCE_GROUP_NAME")
hub_name = os.getenv("AZURE_AI_FOUNDRY_HUB_NAME")
location = 'japaneast'

# 新規作成するリソースの名前
storage_account_name = os.getenv("AZURE_STORAGE_ACCOUNT_NAME")
key_vault_name = os.getenv("AZURE_KEY_VAULT_NAME")
project_name = os.getenv("AZURE_AI_PROJECT_NAME") # プロジェクト名を取得

# --- 認証情報の取得 ---
credential = DefaultAzureCredential()

# --- Step 1: ストレージアカウントの作成 ---
print("--- Step 1: ストレージアカウントの作成を開始します ---")
try:
    storage_client = StorageManagementClient(credential, subscription_id)
    storage_params = {"sku": {"name": "Standard_LRS"}, "kind": "StorageV2", "location": location}
    poller = storage_client.storage_accounts.begin_create(resource_group_name, storage_account_name, storage_params)
    created_storage = poller.result()
    print(f"✅ ストレージアカウント '{created_storage.name}' が正常に作成されました。")
except Exception as e:
    print(f"❌ ストレージアカウント '{storage_account_name}' は既に存在する可能性があります。エラー: {e}")
    # 既存のリソースを取得する試み
    try:
        storage_client = StorageManagementClient(credential, subscription_id)
        created_storage = storage_client.storage_accounts.get_properties(resource_group_name, storage_account_name)
        print(f"✅ 既存のストレージアカウント '{created_storage.name}' を使用します。")
    except Exception as get_e:
        print(f"❌ 既存のストレージアカウントの取得にも失敗しました: {get_e}")
        exit()


# --- Step 2: Key Vaultの作成 ---
print("\n--- Step 2: Key Vaultの作成を開始します ---")
try:
    keyvault_client = KeyVaultManagementClient(credential, subscription_id)
    token = credential.get_token("https://management.azure.com/.default")
    decoded_token = jwt.decode(token.token, options={"verify_signature": False})
    tenant_id, object_id = decoded_token.get('tid'), decoded_token.get('oid')

    if not tenant_id or not object_id:
        raise ValueError("トークンからテナントIDまたはオブジェクトIDを取得できませんでした。")

    kv_properties = VaultProperties(
        tenant_id=tenant_id, sku=Sku(name="standard"),
        access_policies=[AccessPolicyEntry(
            tenant_id=tenant_id, object_id=object_id,
            permissions=Permissions(keys=['all'], secrets=['all'], certificates=['all'], storage=['all'])
        )]
    )
    kv_params = VaultCreateOrUpdateParameters(location=location, properties=kv_properties)
    poller = keyvault_client.vaults.begin_create_or_update(resource_group_name, key_vault_name, kv_params)
    created_kv = poller.result()
    print(f"✅ Key Vault '{created_kv.name}' が正常に作成されました。")
except Exception as e:
    print(f"❌ Key Vault '{key_vault_name}' は既に存在する可能性があります。エラー: {e}")
    try:
        keyvault_client = KeyVaultManagementClient(credential, subscription_id)
        created_kv = keyvault_client.vaults.get(resource_group_name, key_vault_name)
        print(f"✅ 既存のKey Vault '{created_kv.name}' を使用します。")
    except Exception as get_e:
        print(f"❌ 既存のKey Vaultの取得にも失敗しました: {get_e}")
        exit()

# --- Step 3: Azure AI Hubの作成 ---
print("\n--- Step 3: Azure AI Hubの作成を開始します ---")
try:
    ml_client = MLClient(credential, subscription_id, resource_group_name)
    ai_foundry_hub = Hub(
        name=hub_name, location=location, display_name="AI Hub (Custom Resources)",
        storage_account=created_storage.id, key_vault=created_kv.id,
        description="指定した名前のストレージとKey Vaultで作成されたAI Hubです。"
    )
    created_hub = ml_client.workspaces.begin_create(ai_foundry_hub).result()
    print(f"🎉 Azure AI Hub '{created_hub.name}' が正常に作成されました。")
except Exception as e:
    print(f"❌ AI Hub '{hub_name}' は既に存在する可能性があります。エラー: {e}")
    try:
        ml_client = MLClient(credential, subscription_id, resource_group_name, workspace_name=hub_name)
        created_hub = ml_client.workspaces.get(hub_name)
        print(f"✅ 既存のAI Hub '{created_hub.name}' を使用します。")
    except Exception as get_e:
        print(f"❌ 既存のAI Hubの取得にも失敗しました: {get_e}")
        exit()


# --- Step 4: AI HubベースのAI Projectの作成 ---
print("\n--- Step 4: Azure AI Projectの作成を開始します ---")
try:
    # プロジェクトオブジェクトを定義します
    # hub_id に Step 3 で作成したHubのIDを渡すのがポイントです
    ai_project = Project(
        name=project_name,
        location=location,
        display_name=f"Project for {hub_name}",
        hub_id=created_hub.id,
        description=f"{hub_name} に紐づくAIプロジェクトです。"
    )

    # プロジェクトの作成を開始します
    created_project = ml_client.workspaces.begin_create(ai_project).result()
    
    print(f"🎉 AI Project '{created_project.name}' が正常に作成されました。")
    print(f"   - 所属ハブ: {created_hub.name}")
    print(f"   - Azure ポータルURL: https://portal.azure.com/#resource{created_project.id}")
    print("\nすべてのリソースの作成が完了しました!")

except Exception as e:
    print(f"❌ AI Projectの作成中にエラーが発生しました: {e}")
    import traceback
    traceback.print_exc()

コードの詳細解説

このスクリプトは、大きく4つのステップに分かれています。一つずつ見ていきましょう。

Step 1: ストレージアカウントの作成

AI HubとProjectは、データを保存するためのストレージアカウントを必要とします。ここでは azure.mgmt.storage.StorageManagementClient を使って、基本的なストレージアカウントを作成しています。

ポイントは try-except ブロックです。一度作成したリソースを再度作成しようとするとエラーになるため、エラーが発生した場合は「既に存在する」とみなし、既存のリソース情報を取得しにいく設計になっています。これにより、**スクリプトを何度実行しても安全(冪等性がある)**という、IaCの重要な特性を担保しています。

Step 2: Key Vaultの作成

次に、APIキーや接続文字列などの機密情報を安全に保管するための Key Vault を作成します。ここでのポイントは、スクリプトの実行者にKey Vaultへのアクセス権を自動で付与している点です。

token = credential.get_token("https://management.azure.com/.default")
decoded_token = jwt.decode(token.token, options={"verify_signature": False})
tenant_id, object_id = decoded_token.get('tid'), decoded_token.get('oid')

Step 3: Azure AI Hub の作成

いよいよAI Foundryの中核、AI Hub の作成です。AI Hubは、複数のAIプロジェクトで共有されるインフラ(コンピューティングリソース、接続情報など)を管理する中心的な場所です。ここでは azure.ai.ml SDKの MLClient と Hub エンティティを使います。

ai_foundry_hub = Hub(
    # ...
    storage_account=created_storage.id, 
    key_vault=created_kv.id,
    # ...
)
created_hub = ml_client.workspaces.begin_create(ai_foundry_hub).result()

注目すべきは、Hub オブジェクトを定義する際に、Step 1と2で作成したストレージアカウントとKey VaultのリソースIDを渡している点です。これにより、各リソースが正しく関連付けられた状態で AI Hubが作成されます。

Step 4: AI Project の作成

最後に、AI Hubに紐づく AI Project を作成します。AI Projectは、個別のAI開発や実験を行うための作業スペースです。

ai_project = Project(
    # ...
    hub_id=created_hub.id,
    # ...
)
created_project = ml_client.workspaces.begin_create(ai_project).result()

ここでの最重要ポイントは hub_id=created_hub.id です。Step 3で作成したAI HubのIDを指定することで、「このプロジェクトは、あのハブに所属します」という親子関係を定義しています。これにより、プロジェクトはハブで共有されているリソースを利用できるようになります。

実行と確認

準備が整ったら、ターミナルでスクリプトを実行します。

python <あなたのスクリプト名>.py

コンソールのログを確認します。

--- Step 1: ストレージアカウントの作成を開始します ---
✅ ストレージアカウント '<ストレージ名>' が正常に作成されました。

--- Step 2: Key Vaultの作成を開始します ---
✅ Key Vault '<Key Vault名>' が正常に作成されました。

--- Step 3: Azure AI Hubの作成を開始します ---
🎉 Azure AI Hub '<Hub名>' が正常に作成されました。

--- Step 4: Azure AI Projectの作成を開始します ---
🎉 AI Project '<Project名>' が正常に作成されました。
   - 所属ハブ: <Hub名>
   - Azure ポータルURL: https://portal.azure.com/#resource/...

すべてのリソースの作成が完了しました!

まとめ

今回は、Pythonスクリプトを元に、Azure AI Foundryの環境をコードで自動構築する方法を解説しました。

このようにIaCを実践することで、AI開発の面倒な準備作業から解放され、よりクリエイティブで本質的な作業に集中できるようになります。チームに新しいメンバーが加わったときも、このスクリプトを渡すだけで開発環境がすぐに整います。

今回のコードをベースに、次はコンピューティングインスタンスの作成やカスタム環境の定義などを追加していくことで、さらに強力な自動化パイプラインを構築できます。

コメント

タイトルとURLをコピーしました