次の方法で共有


Azure DocumentDB を使用して Python コンソール アプリを構築する

このガイドでは、Azure DocumentDB クラスターに接続するための Python コンソール アプリケーションの構築について説明します。 開発環境を構成し、Azure SDK for Python の azure.identity パッケージを使用して認証を行い、ドキュメントの作成、クエリ、更新などの操作を実行します。

[前提条件]

  • Azure サブスクリプション

    • Azure サブスクリプションをお持ちでない場合は、無料アカウントを作成してください
  • 既存の Azure DocumentDB クラスター

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の概要」を参照してください。

  • CLI 参照コマンドをローカルで実行する場合は、Azure CLI を インストール します。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「 Azure CLI を使用した Azure への認証」を参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • クラスター用に構成された Microsoft Entra 認証で、あなたの ID に root ロールが付与されています。

  • 最新バージョンの Python

コンソール アプリケーションを構成する

次に、新しいコンソール アプリケーション プロジェクトを作成し、クラスターに対して認証するために必要なライブラリをインポートします。

  1. プロジェクトの新しいディレクトリを作成し、仮想環境を設定します。

    mkdir mongodb-app
    cd mongodb-app
    python -m venv .venv
    
  2. 仮想環境をアクティブにします。

    # On Windows
    .venv\Scripts\activate
    
    # On macOS/Linux
    source .venv/bin/activate
    
  3. アプリケーション用の新しい Python ファイルを作成します。

    touch app.py
    
  4. Azure 認証用の azure.identity ライブラリをインストールします。

    pip install azure.identity
    
  5. Python 用の pymongo ドライバーをインストールします。

    pip install pymongo
    

クラスターに接続する

次に、 Azure.Identity ライブラリを使用して、クラスターへの接続に使用する TokenCredential を取得します。 公式の MongoDB ドライバーには、クラスターに接続するときに使用するために Microsoft Entra からトークンを取得するために実装する必要がある特別なインターフェイスがあります。

  1. Python ファイルの先頭に必要なモジュールをインポートします。

    from azure.identity import DefaultAzureCredential
    from pymongo import MongoClient
    from pymongo.auth_oidc import OIDCCallback, OIDCCallbackContext, OIDCCallbackResult
    
  2. MongoDB OpenID Connect (OIDC) コールバック インターフェイスを実装するカスタム クラスを作成します。

    class AzureIdentityTokenCallback(OIDCCallback):
        def __init__(self, credential):
            self.credential = credential
    
        def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult:
            token = self.credential.get_token(
                "https://ossrdbms-aad.database.windows.net/.default").token
            return OIDCCallbackResult(access_token=token)
    
  3. クラスター名変数を設定します。

    clusterName = "<azure-documentdb-cluster-name>"
    
  4. DefaultAzureCredential のインスタンスを作成し、認証プロパティを設定します。

    credential = DefaultAzureCredential()
    authProperties = {"OIDC_CALLBACK": AzureIdentityTokenCallback(credential)}
    
  5. Microsoft Entra 認証で構成された MongoDB クライアントを作成します。

    client = MongoClient(
        f"mongodb+srv://{clusterName}.global.mongocluster.cosmos.azure.com/",
        connectTimeoutMS=120000,
        tls=True,
        retryWrites=True,
        authMechanism="MONGODB-OIDC",
        authMechanismProperties=authProperties
    )
    
    print("Client created")
    

一般的な操作を実行する

最後に、公式ライブラリを使用して、データベース、コレクション、ドキュメントで一般的なタスクを実行します。 ここでは、MongoDB または DocumentDB と対話してコレクションと項目を管理する場合と同じクラスとメソッドを使用します。

  1. データベースへの参照を取得します。

    database = client.get_database("<database-name>")
    
    print("Database pointer created")
    
  2. コレクションへの参照を取得します。

    collection = database.get_collection("<container-name>")
    
    print("Collection pointer created")
    
  3. ドキュメントを作成し、を使用してコレクションにcollection.update_oneします。

    new_document = {
        "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
        "category": "gear-surf-surfboards",
        "name": "Yamba Surfboard",
        "quantity": 12,
        "price": 850.00,
        "clearance": False,
    }
    
    filter = {
        "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
    }
    payload = {
        "$set": new_document
    }
    result = collection.update_one(filter, payload, upsert=True)
    
  4. collection.find_oneを使用して、コレクションから特定のドキュメントを取得します。

    filter = {
        "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
        "category": "gear-surf-surfboards"
    }
    existing_document = collection.find_one(filter)
    print(f"Read document _id:\t{existing_document['_id']}")
    
  5. フィルターに一致する collection.find を持つ複数のドキュメントを照会します。

    filter = {
        "category": "gear-surf-surfboards"
    }
    matched_documents = collection.find(filter)
    
    for document in matched_documents:
        print(f"Found document:\t{document}")