Différences du client S3 entre la version 1 et la version 2 du AWS SDK pour Java - AWS SDK for Java 2.x

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Différences du client S3 entre la version 1 et la version 2 du AWS SDK pour Java

Dans cette rubrique, les différences entre les clients S3 des versions 1 et 2 du SDK for Java sont organisées en fonction de la manière dont l'outil de migration peut automatiser la migration. L'outil prend en charge la migration de la plupart des méthodes de la version 1 à la version 2, mais certaines méthodes nécessitent une migration manuelle. Outre les méthodes client S3, certaines classes S3 V1 n'ont pas d'équivalent V2 direct, ce qui vous oblige à les migrer manuellement.

Exemple de méthodes V1 prises en charge par l'outil de migration

L'outil de migration migre automatiquement la plupart des méthodes de la V1 à la V2. Les getObject méthodes putObject et en sont deux exemples.

putObject

// SDK V1 s3Client.putObject("my-bucket", "my-key", "Hello World!"); // SDK V2 s3Client.putObject(req -> req .bucket("my-bucket") .key("my-key"), RequestBody.fromString("Hello World!"));

getObject

// SDK V1 S3Object object = s3Client.getObject("my-bucket", "my-key"); InputStream content = object.getObjectContent(); // SDK V2 ResponseInputStream<GetObjectResponse> response = s3Client.getObject(req -> req .bucket("my-bucket") .key("my-key"));

Méthodes V1 nécessitant une migration manuelle

Vous devez migrer manuellement les méthodes client V1 S3 suivantes. Lorsque vous utilisez l'outil de migration, un commentaire s'affiche dans le fichier Java de sortie V2 qui vous dirige vers cette rubrique.

Des V1 getObject utilisant des V1 S3ObjectId à V2 GetObjectRequest.builder()

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard() .withRegion(Regions.US_WEST_2) .build(); S3ObjectId s3ObjectId = new S3ObjectId( "my-bucket", "object-key", "abc123version" ); GetObjectRequest getRequest= new GetObjectRequest(s3ObjectId); S3Object s3ObjectVersioned = s3Client.getObject(getRequest); // SDK V2 // V2 does not include a 'S3ObjectId' class. V2 uses the request builder pattern // to supply the bucket, key, and version parameters. S3Client s3Client = S3Client.builder() .region(Region.US_WEST_2) .build(); GetObjectRequest getRequest = GetObjectRequest.builder() .bucket("my-bucket") .key("object-key") .versionId("abc123version") .build(); ResponseInputStream<GetObjectResponse> response = s3Client.getObject(getRequest);

V1 listNextBatchOfObjects à V2 listObjectsV2Paginator

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard() .withRegion(Regions.US_WEST_2) .build(); ObjectListing objectListing = s3ClientV1.listObjects("bucket-name"); while (objectListing.isTruncated()) { objectListing = s3ClientV1.listNextBatchOfObjects(objectListing); for (S3ObjectSummary summary : objectListing.getObjectSummaries()) { System.out.println(summary.getKey()); } } // SDK V2 S3Client s3ClientV2 = S3Client.builder() .region(Region.US_WEST_2) .build(); ListObjectsV2Request request = ListObjectsV2Request.builder() .bucket("bucket-name") .build(); // V2 returns a paginator. ListObjectsV2Iterable responses = s3Client.listObjectsV2Paginator(request); for (ListObjectsV2Response page : responses) { page.contents().forEach(content -> { System.out.println(content.key()); }); }

V1 listNextBatchOfVersions à V2 listObjectVersionsPaginator

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard() .withRegion(Regions.US_WEST_2) .build(); VersionListing versionListing = s3ClientV1.listVersions("bucket-name", "prefix"); while (versionListing.isTruncated()) { versionListing = s3ClientV1.listNextBatchOfVersions(versionListing); for (S3VersionSummary version : versionListing.getVersionSummaries()) { System.out.println(version.getKey() + " " + version.getVersionId()); } } // SDK V2 S3Client s3ClientV2 = S3Client.builder() .region(Region.US_WEST_2) .build(); ListObjectVersionsRequest request = ListObjectVersionsRequest.builder() .bucket("bucket-name") .prefix("prefix") .build(); // V2 returns a paginator. ListObjectVersionsIterable responses = s3ClientV2.listObjectVersionsPaginator(request); for (ListObjectVersionsResponse page : responses) { page.versions().forEach(version -> { System.out.println(version.key() + " " + version.versionId()); }); }

selectObjectContent

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard() .withRegion(Regions.US_WEST_2) .build(); SelectObjectContentRequest request = new SelectObjectContentRequest() .withBucket("bucket-name") .withKey("object-key") .withExpression("select * from S3Object") .withExpressionType(ExpressionType.SQL) SelectObjectContentResult result = s3ClientV1.selectObjectContent(request); InputStream resultInputStream = result.getPayload().getRecordsInputStream(); // SDK V2 // In V2, 'selectObjectContent()' is available only on the S3AsyncClient. // V2 handles responses using an event-based 'SelectObjectContentEventStream'. S3AsyncClient s3ClientV2 = S3AsyncClient.builder() .region(Region.US_WEST_2) .build(); SelectObjectContentRequest request = SelectObjectContentRequest.builder() .bucket("bucket-name") .key("object-key") .expression("select * from S3Object") .expressionType(ExpressionType.SQL) .build(); SelectObjectContentResponseHandler handler = new SelectObjectContentResponseHandler() { // Implement the required abstract methods such as 'onEventStream()'. }; CompletableFuture<Void> future = s3ClientV2.selectObjectContent(request, handler); // The 'SelectObjectContentResponseHandler' implementation processes the results.

aclMéthode des V1 setBucketAcl à V2 sur PutBucketAclRequest.builder()

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard() .withRegion(Regions.US_WEST_2) .build(); AccessControlList acl = new AccessControlList(); acl.grantPermission(GroupGrantee.AllUsers, Permission.Read); s3ClientV1.setBucketAcl("bucket-name", acl); // SDK V2 S3Client s3ClientV2 = S3Client.builder() .region(Region.US_WEST_2) .build(); PutBucketAclRequest request = PutBucketAclRequest.builder() .bucket("bucket-name") .acl(BucketCannedACL.PRIVATE) .build(); s3ClientV2.putBucketAcl(request);

aclMéthode des V1 setObjectAcl à V2 sur PutObjectAclRequest.builder()

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard() .withRegion(Regions.US_WEST_2) .build(); AccessControlList acl = new AccessControlList(); acl.grantPermission(GroupGrantee.AllUsers, Permission.Read); s3ClientV1.setObjectAcl("bucket-name", "object-key", acl); // SDK V2 S3Client s3ClientV2 = S3Client.builder() .region(Region.US_WEST_2) .build(); PutObjectAclRequest request = PutObjectAclRequest.builder() .bucket("bucket-name") .key("object-key") .acl(ObjectCannedACL.PRIVATE) .build(); s3ClientV2.putObjectAcl(request);

V1 initiateMultipartUpload à V2 createMultipartUpload

Exemple de migration

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard() .withRegion(Regions.US_WEST_2) .build(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType("application/zip"); metadata.addUserMetadata("mykey", "myvalue"); InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest( "bucket-name", "object-key", metadata ); InitiateMultipartUploadResult initResponse = s3ClientV1.initiateMultipartUpload(initRequest); String uploadId = initResponse.getUploadId(); // SDK V2 // V1 uses ObjectMetadata methods, whereas V2 uses a simple Map. S3Client s3ClientV2 = S3Client.builder() .region(Region.US_WEST_2) .build(); CreateMultipartUploadRequest createMultipartRequest = CreateMultipartUploadRequest.builder() .bucket("my-bucket") .key("object-key") .contentType("application/zip") .metadata(Collections.singletonMap("mykey", "myvalue")) .build(); CreateMultipartUploadResponse response = s3ClientV2.createMultipartUpload(createMultipartRequest); String uploadId = response.uploadId();

Différences d'implémentation

La valeur Content-Type d'en-tête par défaut pour les méthodes suivantes est différente, comme indiqué dans le tableau suivant.

Version de SDK Méthode Content-TypeValeur par défaut
version 1 initiateMultipartUpload application/octet-stream
version 2 createMultipartUpload binary/octet-stream

regionMéthode des V1 setRegion à V2 sur le générateur de clients

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard().build(); s3ClientV1.setRegion(Region.getRegion(Regions.US_WEST_2)); // SDK V2 S3Client s3ClientV2 = S3Client.builder() .region(Region.US_WEST_2) .build();

V1 setS3ClientOptions(S3ClientOptions clientOptions)

Au lieu d'utiliser un seul S3ClientOptions objet avec la setS3ClientOptions méthode, la V2 fournit des méthodes sur le générateur de clients pour définir les options.

V1 setBucketLoggingConfiguration à V2 putBucketLogging

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard() .withRegion(Regions.US_WEST_2) .build(); BucketLoggingConfiguration loggingConfig = new BucketLoggingConfiguration(); loggingConfig.setDestinationBucketName("log-bucket"); SetBucketLoggingConfigurationRequest request = new SetBucketLoggingConfigurationRequest( "source-bucket", loggingConfig ); s3ClientV1.setBucketLoggingConfiguration(request); // SDK V2 // In V2, V1's 'BucketLoggingConfiguration' is replaced by 'BucketLoggingStatus' // and 'LoggingEnabled'. S3Client s3ClientV2 = S3Client.builder() .region(Region.US_WEST_2) .build(); LoggingEnabled loggingEnabled = LoggingEnabled.builder() .targetBucket("log-bucket") .build(); BucketLoggingStatus loggingStatus = BucketLoggingStatus.builder() .loggingEnabled(loggingEnabled) .build(); PutBucketLoggingRequest request = PutBucketLoggingRequest.builder() .bucket("source-bucket") .bucketLoggingStatus(loggingStatus) .build(); s3ClientV2.putBucketLogging(request);

V1 setBucketLifecycleConfiguration à V2 putBucketLifecycleConfiguration

// SDK V1 BucketLifecycleConfiguration.Rule rule = new BucketLifecycleConfiguration.Rule() .withId("Archive and Delete Rule") .withPrefix("documents/") .withStatus(BucketLifecycleConfiguration.ENABLED) .withTransitions(Arrays.asList( new Transition() .withDays(30) .withStorageClass(StorageClass.StandardInfrequentAccess.toString()), new Transition() .withDays(90) .withStorageClass(StorageClass.Glacier.toString()) )) .withExpirationInDays(365); BucketLifecycleConfiguration configuration = new BucketLifecycleConfiguration() .withRules(Arrays.asList(rule)); s3ClientV1.setBucketLifecycleConfiguration("my-bucket", configuration); // SDK V2 LifecycleRule rule = LifecycleRule.builder() .id("Archive and Delete Rule") .filter(LifecycleRuleFilter.builder() .prefix("documents/") .build()) .status(ExpirationStatus.ENABLED) .transitions(Arrays.asList( Transition.builder() .days(30) .storageClass(TransitionStorageClass.STANDARD_IA) .build(), Transition.builder() .days(90) .storageClass(TransitionStorageClass.GLACIER) .build() )) .expiration(LifecycleExpiration.builder() .days(365) .build()) .build(); PutBucketLifecycleConfigurationRequest request = PutBucketLifecycleConfigurationRequest.builder() .bucket("my-bucket") .lifecycleConfiguration(BucketLifecycleConfiguration.builder() .rules(rule) .build()) .build(); s3ClientV2.putBucketLifecycleConfiguration(request);

V1 setBucketTaggingConfiguration à V2 putBucketTagging

// SDK V1 List<TagSet> tagsets = new ArrayList<>(); TagSet tagSet = new TagSet(); tagSet.setTag("key1", "value1"); tagSet.setTag("key2", "value2"); tagsets.add(tagSet); BucketTaggingConfiguration bucketTaggingConfiguration = new BucketTaggingConfiguration(); bucketTaggingConfiguration.setTagSets(tagsets); SetBucketTaggingConfigurationRequest request = new SetBucketTaggingConfigurationRequest( "my-bucket", bucketTaggingConfiguration ); s3ClientV1.setBucketTaggingConfiguration(request); // SDK V2 Tagging tagging = Tagging.builder() .tagSet(Arrays.asList( Tag.builder() .key("key1") .value("value1") .build(), Tag.builder() .key("key2") .value("value2") .build() )) .build(); PutBucketTaggingRequest request = PutBucketTaggingRequest.builder() .bucket("my-bucket") .tagging(tagging) .build(); s3ClientV2.putBucketTagging(request);

Classes V1 nécessitant une migration manuelle

V1 AccessControlList à V2 AccessControlPolicy

// SDK V1 AccessControlList aclV1 = new AccessControlList(); aclV1.setOwner(new Owner("owner-id", "owner-name")); aclV1.grantPermission(GroupGrantee.AllUsers, Permission.Read); // SDK V2 // To migrate from V1 to V2, replace direct 'AccessControlList' modifications with an // 'AccessControlPolicy.builder()' that contains both owner information and grants. // Note that V2's approach requires building the complete permission set upfront rather than modifying permissions incrementally. AccessControlPolicy acpV2 = AccessControlPolicy.builder() .owner(Owner.builder() .id("owner-id") .displayName("owner-name") .build()) .grants(Arrays.asList( Grant.builder() .grantee(Grantee.builder() .type(Type.GROUP) .uri("http://acs.amazonaws.com/groups/global/AllUsers") .build()) .permission(Permission.READ) .build() )) .build();

L'CannedAccessControlListénumération des V1 vers les V2 BucketCannedACL et les énumérations ObjectCannedACL

// SDK V1 // In V1, 'CannedAccessControlList' is an enumeration of predefined ACLs. AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard().build(); // Creating a bucket. s3ClientV1.setBucketAcl("bucket-name", CannedAccessControlList.PublicRead); // Creating an object. PutObjectRequest putObjectRequest = new PutObjectRequest("bucket-name", "object-key", file) .withCannedAcl(CannedAccessControlList.PublicRead); s3ClientV1.putObject(putObjectRequest); // SDK V2 // V2 replaces V1's 'CannedAccessControlList' with 'BucketCannedACL' for buckets and 'ObjectCannedACL' for objects. S3Client s3ClientV2 = S3Client.builder().build(); // Creating a bucket. PutBucketAclRequest bucketRequest = PutBucketAclRequest.builder() .bucket("bucket-name") .acl(BucketCannedACL.PRIVATE) .build(); s3ClientV2.putBucketAcl(bucketRequest); // Creating an object. PutObjectRequest objectRequest = PutObjectRequest.builder() .bucket("bucket-name") .key("object-key") .acl(ObjectCannedACL.PUBLIC_READ) .build(); s3ClientV2.putObject(objectRequest, RequestBody.fromFile(file));

V1 BucketNotificationConfiguration à V2 NotificationConfiguration

//SDK V1 BucketNotificationConfiguration notificationConfig = new BucketNotificationConfiguration(); // Adding configurations by name notificationConfig.addConfiguration("lambdaConfig", new LambdaConfiguration("arn:aws:lambda:function", "s3:ObjectCreated:")); notificationConfig.addConfiguration("topicConfig", new TopicConfiguration("arn:aws:sns:topic", "s3:ObjectRemoved:")); notificationConfig.addConfiguration("queueConfig", new QueueConfiguration("arn:aws:sqs:queue", "s3:ObjectRestore:*")); s3Client.setBucketNotificationConfiguration("bucket", notificationConfig); // SDK V2 // In V2, V1's BucketNotificationConfiguration is renamed to NotificationConfiguration. // V2 contains no common abstract class for LambdaFunction/Topic/Queue configurations. NotificationConfiguration notificationConfig = NotificationConfiguration.builder() .lambdaFunctionConfigurations( LambdaFunctionConfiguration.builder() .lambdaFunctionArn("arn:aws:lambda:function") .events(Event.valueOf("s3:ObjectCreated:")) .build()) .topicConfigurations( TopicConfiguration.builder() .topicArn("arn:aws:sns:topic") .events(Event.valueOf("s3:ObjectRemoved:")) .build()) .queueConfigurations( QueueConfiguration.builder() .queueArn("arn:aws:sqs:queue") .events(Event.valueOf("s3:ObjectRestore:*")) .build()) .build(); s3Client.putBucketNotificationConfiguration(req -> req .bucket("bucket") .notificationConfiguration(notificationConfig));

mfaMéthode des V1 MultiFactorAuthentication à V2 sur un générateur de requêtes

// SDK V1 AmazonS3 s3ClientV1 = AmazonS3ClientBuilder.standard() .withRegion(Regions.US_WEST_2) .build(); BucketVersioningConfiguration versioningConfig = new BucketVersioningConfiguration() .withStatus(BucketVersioningConfiguration.ENABLED); // Create an MFA configuration object. MultiFactorAuthentication mfa = new MultiFactorAuthentication( "arn:aws:iam::1234567890:mfa/user", "123456" ); // Create the request object. SetBucketVersioningConfigurationRequest request = new SetBucketVersioningConfigurationRequest( "bucket-name", versioningConfig, mfa ); // Send the request. s3ClientV1.setBucketVersioningConfiguration(request); // SDK V2 // V2 replaces V1's MultiFactorAuthentication POJO with parameters you set on the request builder. S3Client s3ClientV2 = S3Client.builder() .region(Region.US_WEST_2) .build(); PutBucketVersioningRequest request = PutBucketVersioningRequest.builder() .bucket("bucket-name") .versioningConfiguration(VersioningConfiguration.builder() .status(BucketVersioningStatus.ENABLED) .build()) .mfa("arn:aws:iam::1234567890:mfa/user 123456") // Single method takes both MFA erial number and token. .build(); s3ClientV2.putBucketVersioning(request);