Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Diferencias del cliente S3 entre la versión 1 y la versión 2 del AWS SDK para Java
En este tema, las diferencias entre los clientes S3 de la versión 1 y la versión 2 del SDK for Java se organizan según la forma en que la herramienta de migración puede automatizar la migración. La herramienta admite la migración de la mayoría de los métodos de la V1 a la V2, pero algunos métodos requieren la migración manual. Además de los métodos de cliente de S3, algunas clases de S3 V1 no tienen un equivalente directo de V2, por lo que es necesario migrarlas manualmente.
Contenido
Ejemplos de métodos V1 compatibles con la herramienta de migración
La herramienta de migración migra automáticamente la mayoría de los métodos de la V1 a la V2. Los getObject
métodos putObject
y son dos ejemplos.
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étodos V1 que requieren migración manual
Debe migrar manualmente los siguientes métodos de cliente V1 S3. Al utilizar la herramienta de migración, verá un comentario en el archivo Java de salida de la V2 que le remite a este tema.
En V1 se getObject
utilizan las de V1 S3ObjectId
a las 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);
De V1 listNextBatchOfObjects
a 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()); }); }
De V1 listNextBatchOfVersions
a 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.
El acl
método de V1 setBucketAcl
a V2 está activado 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);
El acl
método de V1 setObjectAcl
a V2 está activado 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);
De V1 initiateMultipartUpload
a V2 createMultipartUpload
Ejemplo de migración
// 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();
Diferencias de implementación
El valor del Content-Type
encabezado predeterminado para los métodos siguientes es diferente, como se muestra en la tabla siguiente.
Versión de SDK | Método | Content-Type Valor predeterminado |
---|---|---|
versión 1 | initiateMultipartUpload |
application/octet-stream |
versión 2 | createMultipartUpload |
binary/octet-stream |
region
Método de V1 setRegion
a V2 en el generador de clientes
// 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();
De V1 setS3ClientOptions(S3ClientOptions clientOptions)
En lugar de utilizar un único S3ClientOptions
objeto con el setS3ClientOptions
método, V2 proporciona métodos en el generador de clientes para configurar las opciones.
De V1 setBucketLoggingConfiguration
a 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);
De V1 setBucketLifecycleConfiguration
a 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);
De V1 setBucketTaggingConfiguration
a 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);
Clases V1 que requieren migración manual
De V1 AccessControlList
a 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();
La enumeración de V1 a la CannedAccessControlList
enumeración de V2 BucketCannedACL
y ObjectCannedACL
las enumeraciones
// 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));
De V1 BucketNotificationConfiguration
a 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));
El mfa
método de V1 MultiFactorAuthentication
a V2 en un generador de solicitudes
// 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);