次の方法で共有


Azure SDK for Rust クレートを使用して Azure サービスにアクセスする

Azure SDK for Rust クレートは、Rust アプリケーションから Azure サービスにアクセスするのに役立ちます。 この記事では、認証、サポートされているサービス、ベスト プラクティスなど、これらのクレートを使用する方法について説明します。

クレート | API リファレンス ドキュメント | ソースコード

クレートを使用して開発するための前提条件

ヒント

最適な開発エクスペリエンスを実現するために、最新の安定したバージョンの Rust がインストールされていることを確認します。

認証資格情報を指定する

Azure クレートには、Microsoft Entra ID に対する認証に資格情報が必要です。 Azure サービスは、接続にさまざまな認証方法を提供します。 認証には azure_identity クレートを使用することをお勧めします。 Rust クレート用 Azure SDK の認証の詳細について説明します。

クライアント オブジェクト

クライアント オブジェクトを使用して Azure サービスを操作します。 サービスのクレートからの各クライアント オブジェクトは、特定の Azure サービスに対応し、そのサービスに対して操作を実行するメソッドを提供します。 たとえば、 azure_security_keyvault_secrets::SecretClient は、Azure Key Vault シークレットとの対話に使用されます。

クライアント オブジェクトを作成するときに、サービスとの対話をカスタマイズするための ClientOptions パラメーターを指定できます。 タイムアウト、再試行ポリシー、その他の構成などを設定するには、 ClientOptions を使用します。

use azure_identity::AzureCliCredential;
use azure_security_keyvault_secrets::SecretClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    dotazure::load()?;

    let vault_url = std::env::var("AZURE_KEYVAULT_URL")
        .map_err(|_| "AZURE_KEYVAULT_URL environment variable is required")?;

    let credential = AzureCliCredential::new(None)?;

    let client = SecretClient::new(&vault_url, credential.clone(), None)?;

    Ok(())
}

エラー処理

サービス呼び出しが失敗した場合、返される 応答 には statusが含まれます。

use azure_core::{error::ErrorKind, http::StatusCode};
use azure_identity::AzureCliCredential;
use azure_security_keyvault_secrets::SecretClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    dotazure::load()?;

    let credential = AzureCliCredential::new(None)?;

    let vault_url = std::env::var("AZURE_KEYVAULT_URL")
        .map_err(|_| "AZURE_KEYVAULT_URL environment variable is required")?;

    let client = SecretClient::new(&vault_url, credential.clone(), None)?;

    match client.get_secret("secret-0", None).await {
        Ok(secret) => println!("Secret value: {}", secret.into_body()?.value.unwrap_or_default()),
        Err(e) => match e.kind() {
            ErrorKind::HttpResponse { status, error_code, .. } if *status == StatusCode::NotFound => {

                if let Some(code) = error_code {
                    println!("ErrorCode: {}", code);
                } else {
                    println!("Secret not found, but no error code provided.");
                }
            },
            _ => println!("An error occurred: {e:?}"),
        },
    }

    Ok(())
}

ページの結果

サービス呼び出しがページで複数の値を返す場合、Result<Pager<T>>ResultとしてPagerが返されます。

use azure_identity::AzureCliCredential;
use azure_security_keyvault_secrets::SecretClient;
use futures::TryStreamExt;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    dotazure::load()?;

    let credential = AzureCliCredential::new(None)?;

    let vault_url = std::env::var("AZURE_KEYVAULT_URL")
        .map_err(|_| "AZURE_KEYVAULT_URL environment variable is required")?;

    let client = SecretClient::new(&vault_url, credential.clone(), None)?;

    let mut pager = client.list_secret_properties(None)?.into_pages();

    while let Some(page) = pager.try_next().await? {

        let page = page.into_body()?;
        println!("items_in_page: {}", page.value.len());
    }

    Ok(())
}

アイテムの各ページを処理するための改ページ

ページ分割された応答内のすべての項目を反復処理するには、返されたinto_pages()Pager メソッドを使用します。 このメソッドは、ページの非同期ストリームを PageIteratorとして返します。これにより、各ページが使用可能になったときに処理できます。

use azure_identity::AzureDeveloperCliCredential;
use azure_security_keyvault_secrets::{ResourceExt, SecretClient};
use futures::TryStreamExt;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    dotazure::load()?;

    let credential = AzureDeveloperCliCredential::new(None)?;

    let vault_url = std::env::var("AZURE_KEYVAULT_URL")
        .map_err(|_| "AZURE_KEYVAULT_URL environment variable is required")?;

    let client = SecretClient::new(vault_url.as_str(), credential.clone(), None)?;

    let mut pager = client.list_secret_properties(None)?;

    while let Some(secret) = pager.try_next().await? {

        let name = secret.resource_id()?.name;
        println!("Found secret with name: {}", name);
    }

    Ok(())
}

サンプル コード

この記事に示すコードは、 https://github.com/azure-samples/azure-sdk-for-rust-docs/で入手できます。

次のステップ