다음을 통해 공유


.NET에서 Blob 버전 만들기 및 나열

Blob 버전 관리에서는 수정하거나 삭제할 때마다 이전 버전의 Blob을 자동으로 만듭니다. Blob 버전 관리를 사용하는 경우 데이터를 잘못 수정하거나 삭제한 경우 이전 버전의 Blob을 복원하여 데이터를 복구할 수 있습니다.

최적의 데이터 보호를 위해 스토리지 계정에 Blob 버전 관리와 Blob 일시 삭제를 모두 사용하도록 설정하는 것이 좋습니다. 자세한 내용은 Blob 버전 관리Blob에 대한 일시 삭제를 참조하세요.

새 버전을 트리거하기 위해 Blob 수정

다음 코드 예제에서는 12.5.1 이상 버전의 .NET에 대한 Azure Storage 클라이언트 라이브러리를 사용하여 새 버전 만들기를 트리거하는 방법을 보여 줍니다. 예제를 실행하기 전에 스토리지 계정에 대한 버전 관리를 사용하도록 설정했는지 확인합니다.

예제에서는 블록 Blob을 만든 다음 Blob의 메타데이터를 업데이트합니다. Blob의 메타데이터를 업데이트하면 새 버전 생성이 트리거됩니다. 예제에서는 초기 버전 및 현재 버전을 검색하고 현재 버전에만 메타데이터가 포함되어 있음을 보여 줍니다.

public static async Task UpdateVersionedBlobMetadata(BlobContainerClient blobContainerClient, 
                                                     string blobName)
{
    try
    {
        // Create the container.
        await blobContainerClient.CreateIfNotExistsAsync();

        // Upload a block blob.
        BlockBlobClient blockBlobClient = blobContainerClient.GetBlockBlobClient(blobName);

        string blobContents = string.Format("Block blob created at {0}.", DateTime.Now);
        byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);

        string initalVersionId;
        using (MemoryStream stream = new MemoryStream(byteArray))
        {
            Response<BlobContentInfo> uploadResponse = 
                await blockBlobClient.UploadAsync(stream, null, default);

            // Get the version ID for the current version.
            initalVersionId = uploadResponse.Value.VersionId;
        }

        // Update the blob's metadata to trigger the creation of a new version.
        Dictionary<string, string> metadata = new Dictionary<string, string>
        {
            { "key", "value" },
            { "key1", "value1" }
        };

        Response<BlobInfo> metadataResponse = 
            await blockBlobClient.SetMetadataAsync(metadata);

        // Get the version ID for the new current version.
        string newVersionId = metadataResponse.Value.VersionId;

        // Request metadata on the previous version.
        BlockBlobClient initalVersionBlob = blockBlobClient.WithVersion(initalVersionId);
        Response<BlobProperties> propertiesResponse = await initalVersionBlob.GetPropertiesAsync();
        PrintMetadata(propertiesResponse);

        // Request metadata on the current version.
        BlockBlobClient newVersionBlob = blockBlobClient.WithVersion(newVersionId);
        Response<BlobProperties> newPropertiesResponse = await newVersionBlob.GetPropertiesAsync();
        PrintMetadata(newPropertiesResponse);
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

static void PrintMetadata(Response<BlobProperties> propertiesResponse)
{
    if (propertiesResponse.Value.Metadata.Count > 0)
    {
        Console.WriteLine("Metadata values for version {0}:", propertiesResponse.Value.VersionId);
        foreach (var item in propertiesResponse.Value.Metadata)
        {
            Console.WriteLine("Key:{0}  Value:{1}", item.Key, item.Value);
        }
    }
    else
    {
        Console.WriteLine("Version {0} has no metadata.", propertiesResponse.Value.VersionId);
    }
}

Blob 버전 목록

Blob 버전을 나열하려면 버전 필드를 사용하여 BlobStates 매개 변수를 지정합니다. 버전은 생성된 시간 순서대로 나열됩니다.

다음 코드 예제에서는 Blob 버전을 나열하는 방법을 보여줍니다.

private static void ListBlobVersions(BlobContainerClient blobContainerClient, 
                                           string blobName)
{
    try
    {
        // Call the listing operation, specifying that blob versions are returned.
        // Use the blob name as the prefix. 
        var blobVersions = blobContainerClient.GetBlobs
            (BlobTraits.None, BlobStates.Version, prefix: blobName)
            .OrderByDescending(version => version.VersionId).Where(blob => blob.Name == blobName);

        // Construct the URI for each blob version.
        foreach (var version in blobVersions)
        {
            BlobUriBuilder blobUriBuilder = new BlobUriBuilder(blobContainerClient.Uri)
            {
                BlobName = version.Name,
                VersionId = version.VersionId
            };

            if ((bool)version.IsLatestVersion.GetValueOrDefault())
            {
                Console.WriteLine("Current version: {0}", blobUriBuilder);
            }
            else
            {
                Console.WriteLine("Previous version: {0}", blobUriBuilder);
            }
        }
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

기본 Blob을 통해 이전 Blob 버전 복사

기본 Blob이 온라인 계층(핫 또는 쿨)에 있는 한, 복사 작업을 수행하여 기본 Blob을 통해 버전을 승격할 수 있습니다. 버전은 그대로 유지되지만 읽고 쓸 수 있는 복사본으로 대상을 덮어씁니다.

다음 코드 예제에서는 기본 Blob을 통해 Blob 버전을 복사하는 방법을 보여 줍니다.

public static async Task<BlockBlobClient> CopyVersionOverBaseBlobAsync(
    BlockBlobClient client,
    string versionTimestamp)
{
    // Instantiate BlobClient with identical URI and add version timestamp
    BlockBlobClient versionClient = client.WithVersion(versionTimestamp);

    // Restore the specified version by copying it over the base blob
    await client.SyncUploadFromUriAsync(versionClient.Uri);

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

리소스

.NET용 Azure Blob Storage 클라이언트 라이브러리를 사용하여 Blob 버전을 관리하는 방법에 대한 자세한 내용은 다음 리소스를 참조하세요.

클라이언트 라이브러리 리소스

참고 항목