Как создать подписанный URL-адрес s3 для корзины запрашивающей стороны в python - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть заявитель, платящий корзину, которую я не контролирую в форме:

s3://bucket-name/path-to-my-file

Я пытаюсь сгенерировать предопределенный URL-адрес для отправки в веб-приложение, чтобы отобразить его в браузер.

Я прошел через boto s3 documentation, но не могу найти ничего, что покрывает это: (

Мой скрипт ниже создает URL-адрес возврата, который не имеет доступа и возвращает эту ошибку из s3:

<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
  <RequestId>11DCA24D8DF2E9E8</RequestId>
  <HostId>SeTDlt66hPsj5/dV1pOT9GnYyWgpSGI4ezI3wC7iz8Pny9sy2sUWsuUsl4JkEQeBXXIyiE8EXCk=</HostId>
</Error>

Я уверен, что это потому, что корзина платит запрашивающей стороне, потому что когда я запускаю эту команду в aws, она работает:

aws s3 cp s3://blackfynn-discover-use1/66/2/files/Derivatives . --request-payer requester --recursive

Но этот возвращает Forbidden:

aws s3 cp s3://blackfynn-discover-use1/66/2/files/Derivatives . 

Вот мой python скрипт, который работал бы, если бы он не платил запрашивающей стороне:

import requests
import boto3

def get_signed_url(s3_url):
    # Get the service client.
    s3 = boto3.client('s3')
    bucket_name, key_name = split_s3_bucket_key(s3_url)
    # Generate the URL to get 'key-name' from 'bucket-name'
    url = s3.generate_presigned_url(
        ClientMethod='get_object',
        Params={
            'Bucket': bucket_name,
            'Key': key_name
        }
    )
    return url

def split_s3_bucket_key(s3_path):
    """Split s3 path into bucket and key prefix.
    This will also handle the s3:// prefix.
    :return: Tuple of ('bucketname', 'keyname')
    """
    if s3_path.startswith('s3://'):
        s3_path = s3_path[5:]
    return find_bucket_key(s3_path)

def find_bucket_key(s3_path):
    """
    This is a helper function that given an s3 path such that the path is of
    the form: bucket/key
    It will return the bucket and the key represented by the s3 path
    """
    s3_components = s3_path.split('/')
    bucket = s3_components[0]
    s3_key = ""
    if len(s3_components) > 1:
        s3_key = '/'.join(s3_components[1:])
    return bucket, s3_key

s3_file_path = 's3://blackfynn-discover-use1/66/2/files/Derivatives/manifest.xlsx'
get_signed_url(s3_file_path)

1 Ответ

1 голос
/ 14 апреля 2020

Похоже, что URL должен включать x-amz-request-payer=requester, но это также необходимо указать при создании предварительно подписанного URL.

Попробуйте совет, показанный ниже, а затем сообщите нам, если он работал для вас!

С Загрузка объектов в корзины Requester Pays - Amazon Simple Storage Service :

Для подписанных URL-адресов включите x-amz-request-payer=requester в запрос

С Запрашивающая поддержка платит корзины S3 · Выпуск # 346 · samtools / htslib :

OK, удалось скомпилировать htslib с хорошей поддержкой libcurl. Подтверждено, что для просмотра файлов может потребоваться предварительно заданный URL-адрес:

import boto3
client = boto3.client('s3')
url  = client.generate_presigned_url("get_object", Params={"Bucket":"angel-reqpay","Key":"test.cram" , "RequestPayer":'requester'})

Из AWS Форумы разработчиков: объявление опции «Платит реквестер» для ... :

Ваш URL будет выглядеть примерно так:

http://somebucket.s3.amazonaws.com/key/[.....]&x-amz-request-payer=requester
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...