Как скопировать объект в другую учетную запись amazon с помощью aws sdk v2?

#java #amazon-web-services #aws-sdk

Вопрос:

Я работаю над проектом java, в котором я использую aws sdk v2 для использования сервисов amazon s3 . Я выполняю операцию копирования, она работает с одной и той же учетной записью, но не работает с другой учетной записью.

Код :-

      public void copyObjects(S3Object[] s3DestObjects, String sDestBucket, String sSourceBucket, String sSourceObject) {
        try {
    AwsBasicCredentials awsCreds = AwsBasicCredentials.create(
                    ACCESS_KEY,
                    SECRET_KEY);
            S3ClientBuilder s3ClientBuilder = 
        S3Client.builder().credentialsProvider(StaticCredentialsProvider.create(awsCreds));
            
                s3ClientBuilder.region(Region.US_EAST_2);
            
            S3Client s3Client = s3ClientBuilder.build();
            String encodedUrl = null;
            try {
                encodedUrl = URLEncoder.encode(sSourceBucket   "/"   sSourceObject, StandardCharsets.UTF_8.toString());
            } catch (UnsupportedEncodingException e) {
                System.out.println("URL could not be encoded: "   e.getMessage());
            }
            for (S3Object s3DestObject : s3DestObjects) {

                //CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder().destinationBucket(dstBucket).destinationKey(dstS3Object.key).copySource(encodedUrl).build();
                CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder()
                        .copySource(encodedUrl)
                        .destinationBucket(sDestBucket)
                        .destinationKey(s3DestObject.key)
                        .metadata(s3DestObject.getMetadata()).metadataDirective(MetadataDirective.REPLACE)
                        .build();
                CopyObjectResponse copyObjectResponse = s3Client.copyObject(copyObjectRequest);
            }
        } catch (S3Exception e) {
            throw e;
        }
    }
 

Этот приведенный выше код работает с одним и тем же ведром учетных записей, но не работает с другим ведром учетных записей и выдает ошибку :-

  Access Denied (Service: S3, Status Code: 403, Request ID: 4VCND27Z6P3CEJ8H, Extended Request ID: 2T88jx4 R LjO74pBHOhJj8uOUx6M4Hx3UYYkWm4Sbf6cb9NVM8f5DvFcanv0rbXhZUfEkqpSuI=)
 

пожалуйста, подскажите, как я могу копировать объекты в разные учетные записи?

Ответ №1:

Похоже, ваша ситуация такова:

  • У вас есть корзины Amazon S3 в разных аккаунтах AWS
  • Вы хотите скопировать объекты между корзинами

Есть два способа сделать это:

1. «Подтолкните» объекты

Если ваш код выполняется в учетной записи A, и вы хотите скопировать его из корзины в учетной записи A в корзину в учетной записи B, вам потребуется:

  • Разрешение на объект IAM (например, Пользователь IAM или Роль IAM), который используется вашей программой для записи в корзину в учетной записи B, И
  • Политика корзины для корзины в учетной записи B, которая разрешает сущности IAM, используемой вашей программой, выполнять запись в корзину
  • При копировании объекта необходимо установить ACL=bucket-owner-full-control значение «передача» права собственности на объект целевой учетной записи AWS

или

2. «Вытяните» объекты

Если ваш код выполняется в учетной записи B и вы хотите скопировать его из корзины в учетной записи A в корзину в учетной записи B, вам потребуется:

  • Разрешение на объект IAM (например, Пользователь IAM или Роль IAM), который используется вашей программой для чтения из корзины в учетной записи A, И
  • Политика корзины для корзины в учетной записи A, которая позволяет сущности IAM, используемой вашей программой, считывать данные из корзины

Обратите внимание, что в обоих случаях вашей программе требуется разрешение от учетной записи AWS, в которой она выполняется, И политика корзины для корзины в другой учетной записи AWS.