As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Diferenças do cliente S3 entre a versão 1 e a versão 2 do AWS SDK para Java
Neste tópico, as diferenças entre os clientes S3 na versão 1 e na versão 2 do SDK for Java são organizadas de acordo com a forma como a ferramenta de migração pode automatizar a migração. A ferramenta suporta a migração da maioria dos métodos da V1 para a V2, mas alguns métodos exigem a migração manual. Além dos métodos de cliente do S3, algumas classes do S3 V1 não têm um equivalente direto da V2, exigindo que você as migre manualmente.
Sumário
Exemplo de métodos V1 suportados pela ferramenta de migração
A ferramenta de migração migra automaticamente a maioria dos métodos da V1 para a V2. Os getObject
métodos putObject
e são dois exemplos.
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 exigem migração manual
Você precisa migrar manualmente os seguintes métodos de cliente V1 S3. Ao usar a ferramenta de migração, você vê um comentário no arquivo Java de saída V2 que o direciona para esse tópico.
V1 está getObject
usando V1 S3ObjectId
a 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
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()); }); }
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.
Método de V1 setBucketAcl
a V2 em acl
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);
Método de V1 setObjectAcl
a V2 em acl
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
a V2 createMultipartUpload
Exemplo de migração
// 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();
Diferenças de implementação
O valor do Content-Type
cabeçalho padrão para os métodos a seguir é diferente, conforme mostrado na tabela a seguir.
Versão do SDK | Método | Content-Type Valor padrão |
---|---|---|
versão 1 | initiateMultipartUpload |
application/octet-stream |
version 2 | createMultipartUpload |
binary/octet-stream |
region
Método de V1 setRegion
a V2 no construtor 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();
V1 setS3ClientOptions(S3ClientOptions clientOptions)
Em vez de usar um único S3ClientOptions
objeto com o setS3ClientOptions
método, a V2 fornece métodos no construtor do cliente para definir opções.
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);
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);
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);
Classes V1 que exigem migração manual
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();
CannedAccessControlList
Enum de V1 para V2 e enums BucketCannedACL
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
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));
mfa
Método de V1 MultiFactorAuthentication
a V2 em um construtor de solicitações
// 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);