#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.