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

AWS SDK for Java를 사용한 여러 객체 삭제

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

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

1

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

2

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

3

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

다음은 앞선 단계에서 설명한 작업을 실행하는 Java 코드 샘플입니다.

Copy
DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest(bucketName); List<KeyVersion> keys = new ArrayList<KeyVersion>(); keys.add(new KeyVersion(keyName1)); keys.add(new KeyVersion(keyName2)); keys.add(new KeyVersion(keyName3)); multiObjectDeleteRequest.setKeys(keys); try { DeleteObjectsResult delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest); System.out.format("Successfully deleted all the %s items.\n", delObjRes.getDeletedObjects().size()); } catch (MultiObjectDeleteException e) { // Process exception. }

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

Copy
System.out.format("%s \n", e.getMessage()); System.out.format("No. of objects successfully deleted = %s\n", e.getDeletedObjects().size()); System.out.format("No. of objects failed to delete = %s\n", e.getErrors().size()); System.out.format("Printing error data...\n"); for (DeleteError deleteError : e.getErrors()){ System.out.format("Object Key: %s\t%s\t%s\n", deleteError.getKey(), deleteError.getCode(), deleteError.getMessage()); }

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

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

1

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

2

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

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

3

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

다음은 앞선 단계에서 설명한 작업을 실행하는 Java 코드 샘플입니다.

Copy
List<KeyVersion> keys = new ArrayList<KeyVersion>(); // Provide a list of object keys and versions. DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest(bucketName) .withKeys(keys); try { DeleteObjectsResult delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest); System.out.format("Successfully deleted all the %s items.\n", delObjRes.getDeletedObjects().size()); } catch (MultiObjectDeleteException e) { // Process exception. }

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

다음 Java 코드 예제는 Multi-Object Delete API를 사용하여 버전 관리 미사용 버킷에서 객체를 삭제합니다. 이 예제에서는 먼저 샘플 객체를 버킷에 업로드한 다음 deleteObjects 메서드를 사용하여 단일 요청으로 객체를 삭제합니다.

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

Copy
import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.DeleteObjectsRequest; import com.amazonaws.services.s3.model.DeleteObjectsRequest.KeyVersion; import com.amazonaws.services.s3.model.DeleteObjectsResult; import com.amazonaws.services.s3.model.MultiObjectDeleteException; import com.amazonaws.services.s3.model.MultiObjectDeleteException.DeleteError; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.PutObjectResult; public class DeleteMultipleObjectsNonVersionedBucket { static String bucketName = "*** Provide a bucket name ***"; static AmazonS3Client s3Client; public static void main(String[] args) throws IOException { try { s3Client = new AmazonS3Client(new ProfileCredentialsProvider()); // Upload sample objects.Because the bucket is not version-enabled, // the KeyVersions list returned will have null values for version IDs. List<KeyVersion> keysAndVersions1 = putObjects(3); // Delete specific object versions. multiObjectNonVersionedDelete(keysAndVersions1); } catch (AmazonServiceException ase) { System.out.println("Caught an AmazonServiceException."); System.out.println("Error Message: " + ase.getMessage()); System.out.println("HTTP Status Code: " + ase.getStatusCode()); System.out.println("AWS Error Code: " + ase.getErrorCode()); System.out.println("Error Type: " + ase.getErrorType()); System.out.println("Request ID: " + ase.getRequestId()); } catch (AmazonClientException ace) { System.out.println("Caught an AmazonClientException."); System.out.println("Error Message: " + ace.getMessage()); } } static List<KeyVersion> putObjects(int number) { List<KeyVersion> keys = new ArrayList<KeyVersion>(); String content = "This is the content body!"; for (int i = 0; i < number; i++) { String key = "ObjectToDelete-" + new Random().nextInt(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setHeader("Subject", "Content-As-Object"); metadata.setHeader("Content-Length", (long)content.length()); PutObjectRequest request = new PutObjectRequest(bucketName, key, new ByteArrayInputStream(content.getBytes()), metadata) .withCannedAcl(CannedAccessControlList.AuthenticatedRead); PutObjectResult response = s3Client.putObject(request); KeyVersion keyVersion = new KeyVersion(key, response.getVersionId()); keys.add(keyVersion); } return keys; } static void multiObjectNonVersionedDelete(List<KeyVersion> keys) { // Multi-object delete by specifying only keys (no version ID). DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest( bucketName).withQuiet(false); // Create request that include only object key names. List<KeyVersion> justKeys = new ArrayList<KeyVersion>(); for (KeyVersion key : keys) { justKeys.add(new KeyVersion(key.getKey())); } multiObjectDeleteRequest.setKeys(justKeys); // Execute DeleteObjects - Amazon S3 add delete marker for each object // deletion. The objects no disappear from your bucket (verify). DeleteObjectsResult delObjRes = null; try { delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest); System.out.format("Successfully deleted all the %s items.\n", delObjRes.getDeletedObjects().size()); } catch (MultiObjectDeleteException mode) { printDeleteResults(mode); } } static void printDeleteResults(MultiObjectDeleteException mode) { System.out.format("%s \n", mode.getMessage()); System.out.format("No. of objects successfully deleted = %s\n", mode.getDeletedObjects().size()); System.out.format("No. of objects failed to delete = %s\n", mode.getErrors().size()); System.out.format("Printing error data...\n"); for (DeleteError deleteError : mode.getErrors()){ System.out.format("Object Key: %s\t%s\t%s\n", deleteError.getKey(), deleteError.getCode(), deleteError.getMessage()); } } }

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

다음 Java 코드 예제는 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를 지정합니다. 이 작업을 수행하면 해당 객체가 버킷에서 다시 표시됩니다.

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

Copy
import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.BucketVersioningConfiguration; import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.DeleteObjectsRequest; import com.amazonaws.services.s3.model.DeleteObjectsRequest.KeyVersion; import com.amazonaws.services.s3.model.DeleteObjectsResult; import com.amazonaws.services.s3.model.DeleteObjectsResult.DeletedObject; import com.amazonaws.services.s3.model.MultiObjectDeleteException; import com.amazonaws.services.s3.model.MultiObjectDeleteException.DeleteError; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.PutObjectResult; import com.amazonaws.services.s3.model.SetBucketVersioningConfigurationRequest; public class DeleteMultipleObjectsVersionEnabledBucket { static String bucketName = "*** Provide a bucket name ***"; static AmazonS3Client s3Client; public static void main(String[] args) throws IOException { try { s3Client = new AmazonS3Client(new ProfileCredentialsProvider()); // 1. Enable versioning on the bucket. enableVersioningOnBucket(s3Client, bucketName); // 2a. Upload sample objects. List<KeyVersion> keysAndVersions1 = putObjects(3); // 2b. Delete specific object versions. multiObjectVersionedDelete(keysAndVersions1); // 3a. Upload samples objects. List<KeyVersion> keysAndVersions2 = putObjects(3); // 3b. Delete objects using only keys. Amazon S3 creates a delete marker and // returns its version Id in the response. DeleteObjectsResult response = multiObjectNonVersionedDelete(keysAndVersions2); // 3c. Additional exercise - using multi-object versioned delete, remove the // delete markers received in the preceding response. This results in your objects // reappear in your bucket multiObjectVersionedDeleteRemoveDeleteMarkers(response); } catch (AmazonServiceException ase) { System.out.println("Caught an AmazonServiceException."); System.out.println("Error Message: " + ase.getMessage()); System.out.println("HTTP Status Code: " + ase.getStatusCode()); System.out.println("AWS Error Code: " + ase.getErrorCode()); System.out.println("Error Type: " + ase.getErrorType()); System.out.println("Request ID: " + ase.getRequestId()); } catch (AmazonClientException ace) { System.out.println("Caught an AmazonClientException."); System.out.println("Error Message: " + ace.getMessage()); } } static void enableVersioningOnBucket(AmazonS3Client s3Client, String bucketName) { BucketVersioningConfiguration config = new BucketVersioningConfiguration() .withStatus(BucketVersioningConfiguration.ENABLED); SetBucketVersioningConfigurationRequest setBucketVersioningConfigurationRequest = new SetBucketVersioningConfigurationRequest( bucketName, config); s3Client.setBucketVersioningConfiguration(setBucketVersioningConfigurationRequest); } static List<KeyVersion> putObjects(int number) { List<KeyVersion> keys = new ArrayList<KeyVersion>(); String content = "This is the content body!"; for (int i = 0; i < number; i++) { String key = "ObjectToDelete-" + new Random().nextInt(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setHeader("Subject", "Content-As-Object"); metadata.setHeader("Content-Length", (long)content.length()); PutObjectRequest request = new PutObjectRequest(bucketName, key, new ByteArrayInputStream(content.getBytes()), metadata) .withCannedAcl(CannedAccessControlList.AuthenticatedRead); PutObjectResult response = s3Client.putObject(request); KeyVersion keyVersion = new KeyVersion(key, response.getVersionId()); keys.add(keyVersion); } return keys; } static void multiObjectVersionedDelete(List<KeyVersion> keys) { DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest( bucketName).withKeys(keys); DeleteObjectsResult delObjRes = null; try { delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest); System.out.format("Successfully deleted all the %s items.\n", delObjRes.getDeletedObjects().size()); } catch(MultiObjectDeleteException mode) { printDeleteResults(mode); } } static DeleteObjectsResult multiObjectNonVersionedDelete(List<KeyVersion> keys) { // Multi-object delete by specifying only keys (no version ID). DeleteObjectsRequest multiObjectDeleteRequest = new DeleteObjectsRequest( bucketName); // Create request that include only object key names. List<KeyVersion> justKeys = new ArrayList<KeyVersion>(); for (KeyVersion key : keys) { justKeys.add(new KeyVersion(key.getKey())); } multiObjectDeleteRequest.setKeys(justKeys); // Execute DeleteObjects - Amazon S3 add delete marker for each object // deletion. The objects no disappear from your bucket (verify). DeleteObjectsResult delObjRes = null; try { delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest); System.out.format("Successfully deleted all the %s items.\n", delObjRes.getDeletedObjects().size()); } catch (MultiObjectDeleteException mode) { printDeleteResults(mode); } return delObjRes; } static void multiObjectVersionedDeleteRemoveDeleteMarkers( DeleteObjectsResult response) { List<KeyVersion> keyVersionList = new ArrayList<KeyVersion>(); for (DeletedObject deletedObject : response.getDeletedObjects()) { keyVersionList.add(new KeyVersion(deletedObject.getKey(), deletedObject.getDeleteMarkerVersionId())); } // Create a request to delete the delete markers. DeleteObjectsRequest multiObjectDeleteRequest2 = new DeleteObjectsRequest( bucketName).withKeys(keyVersionList); // Now delete the delete marker bringing your objects back to the bucket. DeleteObjectsResult delObjRes = null; try { delObjRes = s3Client.deleteObjects(multiObjectDeleteRequest2); System.out.format("Successfully deleted all the %s items.\n", delObjRes.getDeletedObjects().size()); } catch (MultiObjectDeleteException mode) { printDeleteResults(mode); } } static void printDeleteResults(MultiObjectDeleteException mode) { System.out.format("%s \n", mode.getMessage()); System.out.format("No. of objects successfully deleted = %s\n", mode.getDeletedObjects().size()); System.out.format("No. of objects failed to delete = %s\n", mode.getErrors().size()); System.out.format("Printing error data...\n"); for (DeleteError deleteError : mode.getErrors()){ System.out.format("Object Key: %s\t%s\t%s\n", deleteError.getKey(), deleteError.getCode(), deleteError.getMessage()); } } }