メニュー
Amazon Simple Storage Service
開発者ガイド (API Version 2006-03-01)

AWS SDK for .NET を使用した複数オブジェクトの削除

以下のタスクは、AWS SDK for .NET のクラスを使用して、単一の HTTP リクエストで複数のオブジェクトを削除する手順を示しています。

複数オブジェクトの削除(バージョニング非対応のバケット)

1

AmazonS3Client クラスのインスタンスを作成します。

2

DeleteObjectsRequest クラスのインスタンスを作成し、削除するオブジェクトキーのリストを指定します。

3

AmazonS3Client.DeleteObjects メソッドを実行します。

1 つ以上のオブジェクトを削除できなかった場合、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. };

例外が発生した場合は、DeleteObjectsException を調べることで、削除が失敗したオブジェクトと失敗の理由を確認できます。以下の C# コード例を参照してください。

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 は削除マーカーを追加します。詳細については、「1 件のリクエストで 1 つのオブジェクトを削除」を参照してください。

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: (バージョニング非対応のバケットからの)複数オブジェクトの削除

次の C# コード例では、Multi-Object 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 マネジメントコンソール を使用して作成できます。

この例は以下のアクションを実行します。

  1. バケットに対してバージョニングを有効にします。

  2. バージョンを指定した削除を実行します。

    この例では最初にサンプルオブジェクトをアップロードします。それに対するレスポンスとして、アップロードした各サンプルオブジェクトのバージョン ID が Amazon S3 から返されます。この例では、次に Multi-Object Delete API を使用してこれらのオブジェクトを削除します。リクエストの中で、オブジェクトキーとバージョン ID の両方を指定します(つまり、バージョンを指定した削除)。

  3. バージョンを指定しない削除を実行します。

    この例では新しいサンプルオブジェクトをアップロードしています。次に、Multi-Object API を使用してオブジェクトを削除します。ただし、リクエスト内ではオブジェクトキーのみを指定しています。この場合、Amazon S3 は削除マーカーを追加し、オブジェクトはバケットに表示されなくなります。

  4. 削除マーカーを削除します。

    マーカーの削除がどのように動作するかを示すために、サンプルでは削除マーカーを削除しています。複数オブジェクト削除リクエストで、オブジェクトキーと、前のステップでレスポンスとして受け取った削除マーカーのバージョン 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; } } }