使用 .NET 管理存储帐户资源

本文介绍如何使用适用于 .NET 的 Azure 存储管理库管理存储帐户资源。 你可以创建和更新存储帐户、列出订阅或资源组中的存储帐户、管理存储帐户密钥以及删除存储帐户。 你还可以将客户端选项配置为使用自定义重试策略或设置其他选项。

先决条件

设置你的环境

如果你没有现有项目,本部分将指导你逐步准备一个项目,使其与适用于 .NET 的 Azure 存储管理库配合使用。 若要详细了解项目设置,请参阅开始使用 .NET 的 Azure 存储管理库

安装包

从项目目录中,使用 dotnet add package 命令安装 Azure 存储资源管理器的包和 Azure 标识客户端库的包。 与 Azure 服务的无密码连接需要 azure-identity 包。

dotnet add package Azure.Identity
dotnet add package Azure.ResourceManager.Storage

添加 using 指令

将这些 using 指令添加到代码文件的顶部:

using Azure.Identity;
using Azure.ResourceManager;

创建 ArmClient 对象

若要连接应用程序并管理存储帐户资源,请创建 ArmClient 对象。 此客户端对象是所有 ARM 客户端的入口点。 由于所有管理 API 都经过同一终结点,因此只需创建一个顶级 ArmClient 即可与资源交互。

以下示例会创建一个使用 DefaultAzureCredential 授权的 ArmClient对象,然后获取指定订阅 ID 的订阅资源:

ArmClient armClient = new ArmClient(new DefaultAzureCredential(), new ArmClientOptions { Environment = ArmEnvironment.AzureChina });

// Create a resource identifier, then get the subscription resource
ResourceIdentifier resourceIdentifier = new($"/subscriptions/{subscriptionId}");
SubscriptionResource subscription = armClient.GetSubscriptionResource(resourceIdentifier);

若要了解如何为资源组或存储帐户资源创建客户端对象,请参阅“创建用于管理存储帐户资源的客户端”。

授权

Azure 提供用于授权调用管理操作的内置角色。 Azure 存储还提供专用于 Azure 存储资源提供程序的内置角色。 有关详细信息,请参阅“管理操作的内置角色”。

创建存储帐户

你可以异步创建具有指定参数的存储帐户。 如果存储帐户已存在,并且后续创建请求使用相同的参数发出,则请求会成功。 如果参数不同,则会更新存储帐户属性。 有关更新现有存储帐户的示例,请参阅“更新存储帐户 SKU”。

每个存储帐户名称在 Azure 中都必须是唯一的。 若要检查存储帐户名称的可用性,可以使用以下方法:

以下代码示例演示如何检查存储帐户名称的可用性:

// Check if the account name is available
bool? nameAvailable = subscription
    .CheckStorageAccountNameAvailability(new StorageAccountNameAvailabilityContent(storageAccountName)).Value.IsNameAvailable;

你可以使用 StorageAccountCollection 类中的以下方法创建存储帐户:

创建存储帐户资源时,可以通过在 content 参数中添加 StorageAccountCreateOrUpdateContent 实例来设置存储帐户的属性。

以下代码示例会创建存储帐户,并为 SKU、类型、位置、访问层和共享密钥访问配置属性:

public static async Task<StorageAccountResource> CreateStorageAccount(
    ResourceGroupResource resourceGroup,
    string storageAccountName)
{
    // Define the settings for the storage account
    AzureLocation location = AzureLocation.ChinaEast2;
    StorageSku sku = new(StorageSkuName.StandardLrs);
    StorageKind kind = StorageKind.StorageV2;

    // Set other properties as needed
    StorageAccountCreateOrUpdateContent parameters = new(sku, kind, location)
    {
        AccessTier = StorageAccountAccessTier.Cool,
        AllowSharedKeyAccess = false,
    };

    // Create a storage account with defined account name and settings
    StorageAccountCollection accountCollection = resourceGroup.GetStorageAccounts();
    ArmOperation<StorageAccountResource> accountCreateOperation = 
        await accountCollection.CreateOrUpdateAsync(WaitUntil.Completed, storageAccountName, parameters);
    StorageAccountResource storageAccount = accountCreateOperation.Value;

    return storageAccount;
}

列出存储器帐户

你可以列出订阅或资源组中的存储帐户。 以下代码示例采用 SubscriptionResource 实例,并列出订阅中的存储帐户:

public static async Task ListStorageAccountsForSubscription(SubscriptionResource subscription)
{
    await foreach (StorageAccountResource storageAccount in subscription.GetStorageAccountsAsync())
    {
        Console.WriteLine($"\t{storageAccount.Id.Name}");
    }
}

以下代码示例采用 ResourceGroupResource 实例,并列出资源组中的存储帐户:

public static async Task ListStorageAccountsInResourceGroup(ResourceGroupResource resourceGroup)
{
    await foreach (StorageAccountResource storageAccount in resourceGroup.GetStorageAccounts())
    {
        Console.WriteLine($"\t{storageAccount.Id.Name}");
    }
}

管理存储帐户密钥

你可以使用以下方法获取存储帐户访问密钥:

此方法会返回 StorageAccountKey 实例的可迭代集合。

以下代码示例会获取存储帐户的密钥,并将名称和值写入控制台,以作为示例:

public static async Task GetStorageAccountKeysAsync(StorageAccountResource storageAccount)
   {
    AsyncPageable<StorageAccountKey> acctKeys = storageAccount.GetKeysAsync();
    await foreach (StorageAccountKey key in acctKeys)
    {
        Console.WriteLine($"\tKey name: {key.KeyName}");
        Console.WriteLine($"\tKey value: {key.Value}");
    }
}

你可以使用以下方法再生成存储帐户访问密钥:

此方法重新生成存储帐户密钥,并将新密钥值作为 StorageAccountKey 实例的可迭代集合的一部分返回。

以下代码示例会重新生成存储帐户密钥:

public static async Task RegenerateStorageAccountKey(StorageAccountResource storageAccount)
{
    StorageAccountRegenerateKeyContent regenKeyContent = new("key1");
    AsyncPageable<StorageAccountKey> regenAcctKeys = storageAccount.RegenerateKeyAsync(regenKeyContent);
    await foreach (StorageAccountKey key in regenAcctKeys)
    {
        Console.WriteLine($"\tKey name: {key.KeyName}");
        Console.WriteLine($"\tKey value: {key.Value}");
    }
}

更新存储帐户 SKU

你可以通过将更新的参数传递给以下任一方法来更新现有存储帐户设置:

以下代码示例将存储帐户 SKU 从 Standard_LRS 更新为 Standard_GRS

public static async Task UpdateStorageAccountSkuAsync(
    StorageAccountResource storageAccount,
    StorageAccountCollection accountCollection)
{
    // Update storage account SKU
    var currentSku = storageAccount.Data.Sku.Name;  // capture the current SKU value before updating
    var kind = storageAccount.Data.Kind ?? StorageKind.StorageV2;
    var location = storageAccount.Data.Location;
    StorageSku updatedSku = new(StorageSkuName.StandardGrs);
    StorageAccountCreateOrUpdateContent updatedParams = new(updatedSku, kind, location);
    await accountCollection.CreateOrUpdateAsync(WaitUntil.Completed, storageAccount.Data.Name, updatedParams);
    Console.WriteLine($"SKU on storage account updated from {currentSku} to {storageAccount.Get().Value.Data.Sku.Name}");
}

删除存储帐户

你可以使用以下方法删除存储帐户:

以下代码示例演示如何删除存储帐户:

public static async Task DeleteStorageAccountAsync(StorageAccountResource storageAccount)
{
    await storageAccount.DeleteAsync(WaitUntil.Completed);
}

配置 ArmClient 选项

创建 ArmClient 对象时,可以传递 ArmClientOptions 实例。 此类允许你为客户端对象的诊断、环境、传输和重试选项配置值。

示例: 配置重试选项

以下代码示例演示如何配置 ArmClient 对象以使用自定义重试策略:

// Provide configuration options for the ArmClient
ArmClientOptions armClientOptions = new()
{
    Retry = {
        Delay = TimeSpan.FromSeconds(2),
        MaxRetries = 5,
        Mode = RetryMode.Exponential,
        MaxDelay = TimeSpan.FromSeconds(10),
        NetworkTimeout = TimeSpan.FromSeconds(100)
    },
    Environment = ArmEnvironment.AzureChina
};

// Authenticate to Azure and create the top-level ArmClient
ArmClient armClient = new(new DefaultAzureCredential(), subscriptionId, armClientOptions);

如果不指定自定义策略,则会使用默认重试值。 下表列出了 RetryOptions 类的属性,及其类型、简要说明和默认值:

properties 类型​​ 说明 默认值
延迟 TimeSpan 固定方法的重试尝试之间的延迟,或基于退避的方法的计算依据的延迟。 如果服务提供了 Retry-After 响应头,则下一次重试将延迟标头值指定的持续时间。 0.8 秒
MaxDelay TimeSpan 如果服务没有提供 Retry-After 响应头,则为重试之间允许的最大延迟。 如果服务提供了 Retry-After 响应头,则下一次重试将延迟标头值指定的持续时间。 1 分钟
MaxRetries int 放弃前的最大重试尝试次数。 3
模式 RetryMode 用于计算重试延迟的方法。 指数
NetworkTimeout TimeSpan 应用于单个网络操作的超时。 100 秒

ArmClient 对象配置重试选项时,请务必注意,存储资源提供程序(管理平面)和数据平面之间的缩放目标不同。 请务必在配置重试选项时考虑这些限制。

如果超出 Azure 存储管理平面 API 的速率限制,则会收到 HTTP 状态代码 429 Too Many Requests,这表示请求受到限制。 响应包含 Retry-After 值,该值会指定在发送下一个请求之前应用程序应该等待(或休眠)的秒数。 如果在重试值用尽之前发送请求,系统不会处理该请求,并会返回一个新的Retry-After值。

资源

若要详细了解如何使用适用于 .NET 的 Azure 管理库来管理资源,请参阅以下资源。

代码示例

REST API 操作

Azure SDK for .NET 包含基于存储资源提供程序 REST API 而生成的库,允许你通过熟悉的 .NET 范例与 REST API 操作进行交互。 用于管理存储帐户资源的管理库方法使用以下文章中所述的 REST API 操作: