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


Создание моментального снимка BLOB-объектов и управление ими с помощью .NET

Моментальный снимок — это объект BLOB в режиме только для чтения, сделанный в определенный момент времени. В этой статье показано, как создавать мгновенные снимки BLOB-объектов и управлять ими с помощью клиентской библиотеки хранилища Azure для .NET.

Дополнительные сведения о моментальных снимках BLOB-объектов в службе хранилища Azure см. в статье Моментальные снимки BLOB-объектов.

Предварительные требования

Настройка среды

Если у вас нет существующего проекта, в этом разделе показано, как настроить проект для работы с клиентской библиотекой Хранилище BLOB-объектов Azure для .NET. Ниже приведены шаги по установке пакета, добавлению using директив и созданию авторизованного клиентского объекта. Дополнительные сведения см. в статье «Начало работы с Azure Blob Storage и .NET».

Установка пакетов

В каталоге вашего проекта установите пакеты для клиентских библиотек хранилища BLOB-объектов Azure и Удостоверений Azure командой dotnet add package. Пакет Azure.Identity необходим для подключений к службам Azure без пароля.

dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity

Добавьте директивы using.

Добавьте эти using директивы в начало файла кода:

using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;

Для некоторых примеров кода в этой статье могут потребоваться дополнительные using директивы.

Создание клиентского объекта

Чтобы подключить приложение к хранилищу BLOB-объектов, создайте экземпляр BLOBServiceClient. В следующем примере показано, как создать клиентский объект с помощью DefaultAzureCredential авторизации:

public BlobServiceClient GetBlobServiceClient(string accountName)
{
    BlobServiceClient client = new(
        new Uri($"https://{accountName}.blob.core.windows.net"),
        new DefaultAzureCredential());

    return client;
}

Вы можете зарегистрировать клиент службы для внедрения зависимостей в приложении .NET.

Вы также можете создавать клиентские объекты для определенных контейнеров или BLOB-объектов. Дополнительные сведения о создании клиентских объектов и управлении ими см. в статье "Создание клиентских объектов и управление ими", взаимодействующих с ресурсами данных.

Авторизация

Механизм авторизации должен иметь необходимые разрешения для работы с моментальными снимками BLOB-объектов. Для авторизации с использованием Microsoft Entra ID (рекомендуется) требуется встроенная роль Azure RBAC Storage Blob Data Contributor или более высокая. Дополнительные сведения см. в руководстве по авторизации для моментального снимка Blob.

Создать моментальный снимок

Чтобы создать снимок блочного BLOB, используйте один из следующих методов:

В следующем примере кода показано, как создать моментальный снимок. Включите ссылку на библиотеку Azure.Identity , чтобы использовать учетные данные Microsoft Entra для авторизации запросов к службе. Дополнительные сведения об использовании класса DefaultAzureCredential для авторизации управляемого удостоверения для доступа к службе хранилища Azure см. в статье Клиентская библиотека Azure Identity для .NET.

private static async Task CreateBlockBlobSnapshot(
    string accountName,
    string containerName, 
    string blobName,
    Stream data)
{
    const string blobServiceEndpointSuffix = ".blob.core.windows.net";
    Uri containerUri = 
        new Uri("https://" + accountName + blobServiceEndpointSuffix + "/" + containerName);

    // Get a container client object and create the container.
    BlobContainerClient containerClient = new BlobContainerClient(containerUri,
        new DefaultAzureCredential());
    await containerClient.CreateIfNotExistsAsync();

    // Get a blob client object.
    BlobClient blobClient = containerClient.GetBlobClient(blobName);

    try
    {
        // Upload text to create a block blob.
        await blobClient.UploadAsync(data);

        // Add blob metadata.
        IDictionary<string, string> metadata = new Dictionary<string, string>
        {
            { "ApproxBlobCreatedDate", DateTime.UtcNow.ToString() },
            { "FileType", "text" }
        };
        await blobClient.SetMetadataAsync(metadata);

        // Sleep 5 seconds.
        System.Threading.Thread.Sleep(5000);

        // Create a snapshot of the base blob.
        // You can specify metadata at the time that the snapshot is created.
        // If no metadata is specified, then the blob's metadata is copied to the snapshot.
        await blobClient.CreateSnapshotAsync();
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

Удаление моментальных снимков

Чтобы удалить BLOB-объект, необходимо сначала удалить все его моментальные снимки. Можно удалить моментальный снимок отдельно или указать, чтобы при удалении исходного объекта BLOB удалялись все его моментальные снимки. Если попытаться удалить блоб, у которого все еще есть моментальные снимки, это вызовет ошибку.

Чтобы удалить объект BLOB и его моментальные снимки, используйте один из следующих методов с перечислением DeleteSnapshotsOption.

В следующем примере кода показано, как удалить блоб и его моментальные снимки в .NET, где blobClient — это объект типа BlobClient.

await blobClient.DeleteIfExistsAsync(DeleteSnapshotsOption.IncludeSnapshots, null, default);

Копирование моментального снимка BLOB-объекта на базовый BLOB-объект.

Вы можете выполнить операцию копирования, чтобы продвинуть моментальный снимок перед его базовым BLOB-объектом, если базовый BLOB-объект находится на уровне доступа (горячий или холодный). Моментальный снимок остается, но его назначение перезаписывается копией, которую можно читать и в которую можно записывать.

В следующем примере кода показано, как скопировать снимок блоба поверх основного BLOB-объекта:

public static async Task<BlockBlobClient> CopySnapshotOverBaseBlobAsync(
    BlockBlobClient client,
    string snapshotTimestamp)
{
    // Instantiate BlockBlobClient with identical URI and add snapshot timestamp
    BlockBlobClient snapshotClient = client.WithSnapshot(snapshotTimestamp);

    // Restore the specified snapshot by copying it over the base blob
    await client.SyncUploadFromUriAsync(snapshotClient.Uri, overwrite: true);

    // Return the client object after the copy operation
    return client;
}

Ресурсы

Дополнительные сведения об управлении моментальными снимками BLOB-объектов с помощью клиентской библиотеки Хранилище BLOB-объектов Azure для .NET см. в следующих ресурсах.

Дополнительные примеры кода, использующие устаревшие пакеты SDK для .NET версии 11.x, см. в примерах кода с помощью .NET версии 11.x.

Ресурсы клиентской библиотеки

См. также