次の方法で共有


Azure Cosmos DB for MongoDB 仮想コアを使用して Rust コンソール アプリを構築する

このガイドでは、Azure Cosmos DB for MongoDB 仮想コア クラスターに接続する Rust コンソール アプリケーションを作成します。 このガイドでは、開発環境の設定、Azure SDK for Rust の azure_identity クレートを使用した認証、およびデータベース内のドキュメントの管理について説明します。

[前提条件]

  • 既存の Azure Cosmos DB for MongoDB (仮想コア) クラスター。
  • Azure Cloud ShellAzure CLI の最新バージョン。

    • CLI 参照コマンドをローカルで実行する場合は、 az login コマンドを使用して Azure CLI にサインインします。
  • クラスター用に構成された Microsoft Entra 認証で、あなたの ID に dbOwner ロールが付与されています。

  • 最新バージョンの Python

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

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

  1. cargo newを使用して新しい Rust プロジェクトを作成します。

    cargo new cosmos-mongodb-app
    cd cosmos-mongodb-app
    
  2. azure_core クレートを依存関係に追加します。

    cargo add azure_core
    
  3. 認証用の azure_identity クレートを追加します。

    cargo add azure_identity
    
  4. クラスターと対話するために、 mongodb ドライバー クレートを追加します。

    cargo add mongodb
    
  5. 非同期操作の場合は、サポートする tokiofutures、および serde クレートも追加します。

    cargo add tokio --features full
    cargo add futures
    cargo add serde --features derive
    

クラスターに接続する

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

  1. main.rs ファイルを開き、必要なクレートとモジュールをインポートします。

    use azure_core::credentials::TokenCredential;
    use azure_identity::DefaultAzureCredential;
    use futures::{FutureExt, TryStreamExt};
    use mongodb::{
        Client,
        bson::doc,
        options::{
            AuthMechanism, ClientOptions, Credential,
            oidc::{self, IdpServerResponse},
        },
    };
    use serde::{Deserialize, Serialize};
    
  2. 必要なエラー処理を使用して、メインの非同期関数を作成します。

    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
    
        Ok(())
    }
    
  3. 構造体 azure_identity::DefaultAzureCredentialの新しいインスタンスを作成します。

    let credential = DefaultAzureCredential::new()?;
    
  4. MongoDB クライアントからのトークン要求を処理する資格情報コールバックを作成します。

    let azure_identity_token_credential = Credential::builder()
        .mechanism(AuthMechanism::MongoDbOidc)
        .oidc_callback(oidc::Callback::machine(move |_| {
            let azure_credential = credential.clone();
            async move {
                let access_token = azure_credential
                    .get_token(&["https://ossrdbms-aad.database.windows.net/.default"])
                    .await
                    .map_err(|e| {
                        mongodb::error::Error::custom(format!("Azure token error: {}", e))
                    })?;
                Ok(IdpServerResponse::builder()
                    .access_token(access_token.token.secret().to_owned())
                    .build())
            }
            .boxed()
        }))
        .build()
        .into();
    
  5. クラスターの名前、スキーム、グローバル エンドポイントを使用して、クラスターから URI (Uniform Resource Indicator) を定義します。

    let cluster_name = "<azure-cosmos-db-mongodb-vcore-cluster-name>";
    
    let uri = format!(
        "mongodb+srv://{}.global.mongocluster.cosmos.azure.com/",
        cluster_name
    );
    
  6. ベスト プラクティス構成、URI、資格情報コールバックを使用して、 mongodb::ClientOptions インスタンスを構築します。

    let mut client_options = ClientOptions::parse(uri).await?;
    
    client_options.connect_timeout = Some(std::time::Duration::from_secs(120));
    client_options.tls = Some(mongodb::options::Tls::Enabled(Default::default()));
    client_options.retry_writes = Some(true);
    
    client_options.credential = Some(azure_identity_token_credential);
    
  7. 構築された設定を使用して、 mongodb::Client の新しいインスタンスを作成します。

    let client = Client::with_options(client_options)?;
    
    println!("Client created");
    

一般的な操作を実行する

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

  1. Product シリアル化をサポートする serde ドキュメントを表す Rust 構造体を作成します。

    #[derive(Serialize, Deserialize, Debug)]
    struct Product {
        _id: String,
        category: String,
        name: String,
        quantity: i32,
        price: f64,
        clearance: bool,
    }
    
  2. 名前でデータベースへの参照を取得します。

    let database = client.database("<database-name>");
    
    println!("Database pointer created");
    
  3. コレクションへの参照を取得します。

    let collection = database.collection::<Product>("<collection-name>");
    
    println!("Collection pointer created");
    
  4. collection.update_oneを使用してドキュメントを作成し、コレクションにアップサートします。

    let document = Product {
        _id: "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb".to_string(),
        category: "gear-surf-surfboards".to_string(),
        name: "Yamba Surfboard".to_string(),
        quantity: 12,
        price: 850.00,
        clearance: false,
    };
    
    let response = collection
        .update_one(
            doc! { "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" },
            doc! { "$set": mongodb::bson::to_document(&document)? },
        )
        .upsert(true)
        .await?;
    
    println!("Documents upserted count:\t{}", response.modified_count);
    
  5. collection.find_oneとフィルターを使用して、コレクションから特定のドキュメントを読み取ります。

    let document = collection
        .find_one(doc! { "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" })
        .await?;
    
    println!("Read document _id:\t{:#?}", document.unwrap()._id);
    
  6. collection.findを使用して、フィルターに一致する複数のドキュメントを照会します。

    let filter = doc! { "category": "gear-surf-surfboards" };
    
    let mut cursor = collection.find(filter).await?;
    
    while let Some(document) = cursor.try_next().await? {
        println!("Found document:\t{:#?}", document);
    }