使用 Azure SDK for Rust crate可以帮助你从 Rust 应用程序访问 Azure 服务。 本文介绍如何使用这些箱,包括身份验证、支持的服务和最佳做法。
Crates | API 参考文档 | Source code
Important
对于新开发,请使用最新的适用于 Rust 的 Azure SDK crate 稳定版本。 每个 crate 都独立进行版本发布,因此请对你的应用程序所依赖的每个 crate 使用最新的稳定版本。
使用 crates 进行开发的先决条件
-
最新的稳定 Rust 工具链。 如果需要最低支持的 Rust 版本(MSRV),请检查
rust-versionRust 工作区清单Azure SDK中的字段。 - 一个Azure订阅。 可以免费创建一个帐户。
- Azure CLI
- Azure 开发人员 CLI
- 适用于 Rust 的 Azure SDK crate
提供身份验证凭据
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(())
}
错误处理
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/获取。
后续步骤
- Crates.io上的Azure SDK库 - 可用的Azure SDK库列表
- Azure SDK设计准则 - 设计原则和模式
- Azure SDK Rust GitHub 存储库 - 问题和源代码
- Cargo 文档 – 完整的 Cargo 参考