使用适用于 Rust 的 Azure SDK crate 访问 Azure 服务

使用 Azure SDK for Rust crate可以帮助你从 Rust 应用程序访问 Azure 服务。 本文介绍如何使用这些箱,包括身份验证、支持的服务和最佳做法。

Crates | API 参考文档 | Source code

Important

对于新开发,请使用最新的适用于 Rust 的 Azure SDK crate 稳定版本。 每个 crate 都独立进行版本发布,因此请对你的应用程序所依赖的每个 crate 使用最新的稳定版本。

使用 crates 进行开发的先决条件

提供身份验证凭据

Azure crate 需要凭据才能向 Microsoft Entra ID 进行身份验证。 Azure服务为连接提供不同的身份验证方法。 建议使用 azure_identity 箱进行身份验证。 详细了解针对 Rust crate 的 Azure SDK 身份验证。

客户端对象

使用客户端对象与Azure服务进行交互。 服务箱中的每个客户端对象对应于特定的Azure服务,并提供对该服务执行操作的方法。 例如,使用azure_security_keyvault_secrets::SecretClient与 Azure 密钥保管库 机密进行交互。 还可以使用 QueueClient、KeyClient 和 CertificateClient 来表示 Azure 队列存储、Azure 密钥保管库 密钥和 Azure 密钥保管库 证书。

创建客户端对象时,可以提供用于 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_model()?.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>> 作为 Pager 的 Result 返回。

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_model()?;
        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/获取。

后续步骤