使用 Azure SDK for Rust 箱访问 Azure 服务

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

箱子 | API 参考文档 | 源代码

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

小窍门

为获得最佳开发体验,请确保已安装最新的稳定版本的 Rust。

提供身份验证凭据

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

客户端对象

使用客户端对象与 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>>结果ResultPager

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/

后续步骤