Поделиться через


Использование пакета SDK Azure для Rust для доступа к службам Azure

Пакет SDK Azure для Rust помогает получить доступ к службам Azure из приложений Rust. В этой статье объясняется, как использовать эти ящики, включая проверку подлинности, поддерживаемые службы и рекомендации.

Ящики | Справочная документация по | APIИсходный код

Предварительные требования для разработки с ящиками

Подсказка

Для оптимальной разработки убедитесь, что установлена последняя стабильная версия Rust.

Предоставление учетных данных проверки подлинности

Для проверки подлинности в идентификаторе Microsoft Entra в ящиках Azure требуются учетные данные. Службы Azure предоставляют различные методы проверки подлинности для подключения. Рекомендуется использовать azure_identity ящик для проверки подлинности. Дополнительные сведения о проверке подлинности для пакета SDK Azure для 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_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>> в виде 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_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/

Дальнейшие шаги