Amazon S3 Копирование между двумя корзинами с различной аутентификацией - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть два сегмента, каждый с собственным ACL.

У меня есть аутентифицированная ссылка на источник:

String source = "https://bucket-name.s3.region.amazonaws.com/key?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=...&X-Amz-SignedHeaders=host&X-Amz-Expires=86400&X-Amz-Credential=...Signature=..."

, и я пытался использовать Java SDK CopyObjectRequest, чтобы скопировать его в другое ведро, используя:

AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey)
AWSCredentialsProvider provider = new AWSStaticCredentialsProvider(credentials)

AmazonS3 s3Client = AmazonS3ClientBuilder
  .standard()
  .withCredentials(provider)

AmazonS3URI sourceURI = new AmazonS3URI(URI(source))
CopyObjectRequest request = new CopyObjectRequest(sourceURI.getBucket, sourceURI.getKey, destinationBucket, destinationKey);
s3Client.copyObject(request);

Однако я получаю AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied, потому что мои учетные данные AWS, с которыми я установил SDK, не имеют доступа к исходному файлу.

Есть ли способ предоставить аутентифицированный исходный URL-адрес вместо простогоbucket и key?

1 Ответ

0 голосов
/ 11 февраля 2019

Это не поддерживается.API службы PUT + Copy, который используется s3Client.copyObject(), использует внутренний механизм S3 для копирования объекта, а исходный объект передается как /bucket/key, а не как полный URL-адрес.Функций API, которые можно использовать для извлечения из URL, S3 или другого, не существует.

С помощью PUT + Copy пользователь, отправляющий запрос на S3 ...

, должениметь READ доступ к исходному объекту и WRITE доступ к целевому контейнеру

https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html

Единственная альтернатива - загрузка с последующей загрузкой.

Выполнение этого из EC2 ... или функции Lambda, выполняющейся в исходной области, было бы наиболее экономически эффективным, но если объект больше, чем временное пространство Lambda, вам придется написать ловушки иобработчики для чтения из потока и перемещения фрагментов в многоэтапную загрузку ... не невозможно, но требует некоторых умственных движений, чтобы понять, что вы на самом деле пытаетесь убедить в выполнении своего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...