메뉴
Amazon Simple Storage Service
개발자 안내서 (API Version 2006-03-01)

.NET용 AWS SDK를 사용한 여러 객체 삭제

다음 작업은 .NET용 AWS SDK 클래스를 사용하여 단일 HTTP 요청으로 여러 객체를 삭제하는 방법을 안내합니다.

여러 객체 삭제(버전 관리 미사용 버킷)

1

AmazonS3Client 클래스의 인스턴스를 만듭니다.

2

DeleteObjectsRequest 클래스의 인스턴스를 만들고 삭제하려는 객체 키의 목록을 제공합니다.

3

AmazonS3Client.DeleteObjects 메서드를 실행합니다.

하나 이상의 객체 삭제에 실패한 경우, Amazon S3에서는 DeleteObjectsException을 내보냅니다.

다음은 앞선 단계에서 설명한 작업을 실행하는 C# 코드 예제입니다.

Copy
DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest(); multiObjectDeleteRequest.BucketName = bucketName; multiObjectDeleteRequest.AddKey("<object Key>", null); // version ID is null. multiObjectDeleteRequest.AddKey("<object Key>", null); multiObjectDeleteRequest.AddKey("<object Key>", null); try { DeleteObjectsResponse response = client.DeleteObjects(multiObjectDeleteRequest); Console.WriteLine("Successfully deleted all the {0} items", response.DeletedObjects.Count); } catch (DeleteObjectsException e) { // Process exception. }

DeleteObjectsRequest 역시 KeyVersion 객체의 목록을 파라미터로 가져올 수 있습니다. 버전 관리 미사용 버킷의 경우, 버전 ID는 null이 됩니다.

Copy
List<KeyVersion> keys = new List<KeyVersion>(); KeyVersion keyVersion = new KeyVersion { Key = key, VersionId = null // For buckets without versioning. }; keys.Add(keyVersion); List<KeyVersion> keys = new List<KeyVersion>(); ... DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest { BucketName = bucketName, Objects = keys // This includes the object keys and null version IDs. };

예외가 발생한 경우, 다음 C# 코드 예제와 같이 DeleteObjectsException을 검토하여 삭제에 실패한 객체와 그 이유를 확인할 수 있습니다.

Copy
DeleteObjectsResponse errorResponse = e.Response; Console.WriteLine("No. of objects successfully deleted = {0}", errorResponse.DeletedObjects.Count); Console.WriteLine("No. of objects failed to delete = {0}", errorResponse.DeleteErrors.Count); Console.WriteLine("Printing error data..."); foreach (DeleteError deleteError in errorResponse.DeleteErrors) { Console.WriteLine("Object Key: {0}\t{1}\t{2}", deleteError.Key, deleteError.Code, deleteError.Message); }

다음 작업은 버전 관리를 사용하는 버킷에서 객체를 삭제하는 방법을 안내합니다.

여러 객체 삭제(버전 관리 사용 버킷)

1

AmazonS3Client 클래스의 인스턴스를 만듭니다.

2

DeleteObjectsRequest 클래스의 인스턴스를 만들고 삭제하려는 객체 키의 목록과 선택적으로 객체의 버전 ID를 제공합니다.

삭제하려는 객체의 버전 ID를 지정하는 경우, Amazon S3에서는 해당 특정 객체 버전을 삭제합니다. 삭제하려는 객체의 버전 ID를 지정하지 않는 경우, Amazon S3에서는 삭제 마커를 추가합니다. 자세한 내용은 요청당 단일 객체 삭제 단원을 참조하십시오.

3

AmazonS3Client.DeleteObjects 메서드를 실행합니다.

다음은 앞선 단계에서 설명한 작업을 실행하는 C# 코드 예제입니다.

Copy
List<KeyVersion> keysAndVersions = new List<KeyVersion>(); // provide a list of object keys and versions. DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest { BucketName = bucketName, Objects = keysAndVersions }; try { DeleteObjectsResponse response = client.DeleteObjects(multiObjectDeleteRequest); Console.WriteLine("Successfully deleted all the {0} items", response.DeletedObjects.Count); } catch (DeleteObjectsException e) { // Process exception. }

예 1: Multi-Object Delete(버전 관리 미사용 버킷)

다음 C# 코드 예제는 Multi-Object Delete API를 사용하여 버전 관리 미사용 버킷에서 객체를 삭제합니다. 이 예제에서는 먼저 샘플 객체를 버킷에 업로드한 다음 DeleteObjects 메서드를 사용하여 단일 요청으로 객체를 삭제합니다. 이 예제에서는 버전 ID가 null이므로 DeleteObjectsRequest에서 객체 키 이름만 지정합니다.

실제 예제를 작성하여 테스트하는 방법에 대한 자세한 내용은 Amazon S3 .NET 코드 예시 실행를 참조하십시오.

Copy
using System; using System.Collections.Generic; using Amazon.S3; using Amazon.S3.Model; namespace s3.amazon.com.docsamples { class DeleteMultipleObjects { static string bucketName = "*** Provide a bucket name ***"; static IAmazonS3 client; public static void Main(string[] args) { using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1)) { var keysAndVersions = PutObjects(3); // Delete the objects. MultiObjectDelete(keysAndVersions); } Console.WriteLine("Click ENTER to continue....."); Console.ReadLine(); } static void MultiObjectDelete(List<KeyVersion> keys) { // a. multi-object delete by specifying the key names and version IDs. DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest { BucketName = bucketName, Objects = keys // This includes the object keys and null version IDs. }; multiObjectDeleteRequest.AddKey("AWSSDKcopy2.dll", null); try { DeleteObjectsResponse response = client.DeleteObjects(multiObjectDeleteRequest); Console.WriteLine("Successfully deleted all the {0} items", response.DeletedObjects.Count); } catch (DeleteObjectsException e) { PrintDeletionReport(e); } } private static void PrintDeletionReport(DeleteObjectsException e) { // var errorResponse = e.ErrorResponse; DeleteObjectsResponse errorResponse = e.Response; Console.WriteLine("x {0}", errorResponse.DeletedObjects.Count); Console.WriteLine("No. of objects successfully deleted = {0}", errorResponse.DeletedObjects.Count); Console.WriteLine("No. of objects failed to delete = {0}", errorResponse.DeleteErrors.Count); Console.WriteLine("Printing error data..."); foreach (DeleteError deleteError in errorResponse.DeleteErrors) { Console.WriteLine("Object Key: {0}\t{1}\t{2}", deleteError.Key, deleteError.Code, deleteError.Message); } } static List<KeyVersion> PutObjects(int number) { List<KeyVersion> keys = new List<KeyVersion>(); for (int i = 0; i < number; i++) { string key = "ExampleObject-" + new System.Random().Next(); PutObjectRequest request = new PutObjectRequest { BucketName = bucketName, Key = key, ContentBody = "This is the content body!", }; PutObjectResponse response = client.PutObject(request); KeyVersion keyVersion = new KeyVersion { Key = key, // For non-versioned bucket operations, we only need object key. // VersionId = response.VersionId }; keys.Add(keyVersion); } return keys; } } }

예 2: Multi-Object Delete(버전 관리 사용 버킷)

다음 C# 코드 예제는 Multi-Object API를 사용하여 버전 관리를 사용하는 버킷에서 객체를 삭제합니다. DeleteObjects Multi-Object Delete API 사용 예제를 보여 주는 것에 추가로, 버전 관리를 사용하는 버킷에서 버전 관리가 작동하는 방식을 보여 줍니다.

샘플을 테스트하기 전에 샘플 버킷을 만들고 예제에 버킷 이름을 제공해야 합니다. AWS Management Console을 사용하여 버킷을 만들 수 있습니다.

이 예제에서는 다음 작업을 수행합니다.

  1. 버킷의 버전 관리를 활성화합니다.

  2. 버전이 지정된 삭제를 수행합니다.

    이 예제에서는 먼저 샘플 객체를 업로드합니다. Amazon S3에서는 응답으로 업로드한 각 샘플 객체의 버전 ID를 반환합니다. 그런 뒤 예제에서는 Multi-Object Delete API를 사용하여 이러한 객체를 삭제합니다. 응답으로 객체 키와 버전 ID를 모두 지정합니다(즉, 버전이 지정된 삭제임).

  3. 버전이 지정되지 않은 삭제를 수행합니다.

    이 예제에서는 새로운 샘플 객체를 업로드한 후 Multi-Object API를 사용하여 객체를 삭제합니다. 그러나 요청에는 객체 키만 지정합니다. 이 경우, Amazon S3에서는 삭제 마커를 추가하고 객체는 버킷에서 사라집니다.

  4. 삭제 마커를 삭제합니다.

    삭제 마커가 작동하는 방식을 나타내기 위해 샘플에서는 삭제 마커를 삭제합니다. Multi-Object Delete 요청에 이전 단계에서 응답으로 수신한 삭제 마커의 객체 키와 버전 ID를 지정합니다. 이 작업을 수행하면 해당 객체가 버킷에서 다시 표시됩니다.

실제 예제를 작성하여 테스트하는 방법에 대한 자세한 내용은 Amazon S3 .NET 코드 예시 실행를 참조하십시오.

Copy
using System; using System.Collections.Generic; using Amazon.S3; using Amazon.S3.Model; namespace s3.amazon.com.docsamples { class DeleteMultipleObjectsVersionedBucket { static string bucketName = "*** Provide a bucket name ***"; static IAmazonS3 client; public static void Main(string[] args) { using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1)) { // 1. Enable versioning on the bucket. EnableVersioningOnBucket(bucketName); // 2a. Upload the sample objects. var keysAndVersions1 = PutObjects(3); // 2b. Delete the specific object versions. VersionedDelete(keysAndVersions1); // 3a. Upload the sample objects. var keysAndVersions2 = PutObjects(3); // 3b. Delete objects using only keys. Amazon S3 creates a delete marker and // returns its version Id in the response. List<DeletedObject> deletedObjects = NonVersionedDelete(keysAndVersions2); // 3c. Additional exercise - using a multi-object versioned delete, remove the // delete markers received in the preceding response. This results in your objects // reappearing in your bucket. RemoveMarkers(deletedObjects); } Console.WriteLine("Click ENTER to continue....."); Console.ReadLine(); } private static void PrintDeletionReport(DeleteObjectsException e) { var errorResponse = e.Response; Console.WriteLine("No. of objects successfully deleted = {0}", errorResponse.DeletedObjects.Count); Console.WriteLine("No. of objects failed to delete = {0}", errorResponse.DeleteErrors.Count); Console.WriteLine("Printing error data..."); foreach (DeleteError deleteError in errorResponse.DeleteErrors) { Console.WriteLine("Object Key: {0}\t{1}\t{2}", deleteError.Key, deleteError.Code, deleteError.Message); } } static void EnableVersioningOnBucket(string bucketName) { PutBucketVersioningRequest setBucketVersioningRequest = new PutBucketVersioningRequest { BucketName = bucketName, VersioningConfig = new S3BucketVersioningConfig { Status = VersionStatus.Enabled } }; client.PutBucketVersioning(setBucketVersioningRequest); } static void VersionedDelete(List<KeyVersion> keys) { // a. Perform a multi-object delete by specifying the key names and version IDs. DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest { BucketName = bucketName, Objects = keys // This includes the object keys and specific version IDs. }; try { Console.WriteLine("Executing VersionedDelete..."); DeleteObjectsResponse response = client.DeleteObjects(multiObjectDeleteRequest); Console.WriteLine("Successfully deleted all the {0} items", response.DeletedObjects.Count); } catch (DeleteObjectsException e) { PrintDeletionReport(e); } } static List<DeletedObject> NonVersionedDelete(List<KeyVersion> keys) { // Create a request that includes only the object key names. DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest(); multiObjectDeleteRequest.BucketName = bucketName; foreach (var key in keys) { multiObjectDeleteRequest.AddKey(key.Key); } // Execute DeleteObjects - Amazon S3 add delete marker for each object // deletion. The objects disappear from your bucket. // You can verify that using the Amazon S3 console. DeleteObjectsResponse response; try { Console.WriteLine("Executing NonVersionedDelete..."); response = client.DeleteObjects(multiObjectDeleteRequest); Console.WriteLine("Successfully deleted all the {0} items", response.DeletedObjects.Count); } catch (DeleteObjectsException e) { PrintDeletionReport(e); throw; // Some deletes failed. Investigate before continuing. } // This response contains the DeletedObjects list which we use to delete the delete markers. return response.DeletedObjects; } private static void RemoveMarkers(List<DeletedObject> deletedObjects) { List<KeyVersion> keyVersionList = new List<KeyVersion>(); foreach (var deletedObject in deletedObjects) { KeyVersion keyVersion = new KeyVersion { Key = deletedObject.Key, VersionId = deletedObject.DeleteMarkerVersionId }; keyVersionList.Add(keyVersion); } // Create another request to delete the delete markers. var multiObjectDeleteRequest = new DeleteObjectsRequest { BucketName = bucketName, Objects = keyVersionList }; // Now, delete the delete marker to bring your objects back to the bucket. try { Console.WriteLine("Removing the delete markers ....."); var deleteObjectResponse = client.DeleteObjects(multiObjectDeleteRequest); Console.WriteLine("Successfully deleted all the {0} delete markers", deleteObjectResponse.DeletedObjects.Count); } catch (DeleteObjectsException e) { PrintDeletionReport(e); } } static List<KeyVersion> PutObjects(int number) { List<KeyVersion> keys = new List<KeyVersion>(); for (int i = 0; i < number; i++) { string key = "ObjectToDelete-" + new System.Random().Next(); PutObjectRequest request = new PutObjectRequest { BucketName = bucketName, Key = key, ContentBody = "This is the content body!", }; PutObjectResponse response = client.PutObject(request); KeyVersion keyVersion = new KeyVersion { Key = key, VersionId = response.VersionId }; keys.Add(keyVersion); } return keys; } } }