このガイドでは、Azure Cosmos DB for MongoDB 仮想コア クラスターに接続する Rust コンソール アプリケーションを作成します。 このガイドでは、開発環境の設定、Azure SDK for Rust の azure_identity
クレートを使用した認証、およびデータベース内のドキュメントの管理について説明します。
[前提条件]
- 既存の Azure Cosmos DB for MongoDB (仮想コア) クラスター。
Azure Cloud Shell の Azure CLI の最新バージョン。
- CLI 参照コマンドをローカルで実行する場合は、
az login
コマンドを使用して Azure CLI にサインインします。
- CLI 参照コマンドをローカルで実行する場合は、
クラスター用に構成された Microsoft Entra 認証で、あなたの ID に
dbOwner
ロールが付与されています。- Microsoft Entra 認証を有効にするには、 構成ガイドを確認します。
最新バージョンの Python。
コンソール アプリケーションを構成する
次に、新しいコンソール アプリケーション プロジェクトを作成し、クラスターに対して認証するために必要なライブラリをインポートします。
cargo new
を使用して新しい Rust プロジェクトを作成します。cargo new cosmos-mongodb-app cd cosmos-mongodb-app
azure_core
クレートを依存関係に追加します。cargo add azure_core
認証用の
azure_identity
クレートを追加します。cargo add azure_identity
クラスターと対話するために、
mongodb
ドライバー クレートを追加します。cargo add mongodb
非同期操作の場合は、サポートする
tokio
、futures
、およびserde
クレートも追加します。cargo add tokio --features full cargo add futures cargo add serde --features derive
クラスターに接続する
次に、 Azure.Identity
ライブラリを使用して、クラスターへの接続に使用する TokenCredential
を取得します。 公式の MongoDB ドライバーには、クラスターに接続するときに使用するために Microsoft Entra からトークンを取得するために実装する必要がある特別なインターフェイスがあります。
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};
必要なエラー処理を使用して、メインの非同期関数を作成します。
#[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { Ok(()) }
構造体
azure_identity::DefaultAzureCredential
の新しいインスタンスを作成します。let credential = DefaultAzureCredential::new()?;
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();
クラスターの名前、スキーム、グローバル エンドポイントを使用して、クラスターから 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 );
ベスト プラクティス構成、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);
構築された設定を使用して、
mongodb::Client
の新しいインスタンスを作成します。let client = Client::with_options(client_options)?; println!("Client created");
一般的な操作を実行する
最後に、公式ライブラリを使用して、データベース、コレクション、ドキュメントで一般的なタスクを実行します。 ここでは、MongoDB または DocumentDB と対話してコレクションと項目を管理する場合と同じクラスとメソッドを使用します。
Product
シリアル化をサポートするserde
ドキュメントを表す Rust 構造体を作成します。#[derive(Serialize, Deserialize, Debug)] struct Product { _id: String, category: String, name: String, quantity: i32, price: f64, clearance: bool, }
名前でデータベースへの参照を取得します。
let database = client.database("<database-name>"); println!("Database pointer created");
コレクションへの参照を取得します。
let collection = database.collection::<Product>("<collection-name>"); println!("Collection pointer created");
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);
collection.find_one
とフィルターを使用して、コレクションから特定のドキュメントを読み取ります。let document = collection .find_one(doc! { "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" }) .await?; println!("Read document _id:\t{:#?}", document.unwrap()._id);
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); }