S3 предварительно подписанный URL без пути - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужен способ, позволяющий клиенту загружать данные в S3 без указания полного местоположения (пути) файла.Это что-то выполнимое с предварительно подписанным URL-адресом AWS S3?

Я использую boto3 как таковой

s3.client.generate_presigned_url(
  ClientMethod='put_object', 
  ExpiresIn=7200,
  Params={'Bucket': BUCKET, 'Key': name}
)

Но результат будет:

https://s3.amazonaws.com/MY_BUCKET/upload/xxxx-xxxx/file-name.bin?AWSAccessKeyId=XXXX&Signature=XXXX&Expires=XXXX

Мне нужно, чтобы что-то подобное не отображало имя ключа в пути (/upload/xxxx-xxxx/file-name.bin).

Какие еще решения у меня есть, если не предварительно подписанный URL-адрес?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Я считаю, что лучшим способом является распространение файлов с помощью AWS Cloudfront.Вы можете установить источник дистрибутива Cloudfront на MY_BUCKET.s3.amazonaws.com.Также можно использовать подпапки, такие как MY_BUCKET.s3.amazonaws.com/upload в качестве источника.

Cloudfront будет обслуживать ваши файлы в источнике S3 с созданным доменом конечной точки CDN или также можно установить и использовать собственный домен.

https://d111111abcdef8.cloudfront.net/upload/xxxx-xxxx/file-name.bin https://uploads.example.com/upload/xxxx-xxxx/file-name.bin

, если вы используете подпапку в качестве источника:

https://uploads.example.com/xxxx-xxxx/file-name.bin


Дополнительная информация о настройке S3 Bucket в качестве источникав Cloudfront: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistS3AndCustomOrigins.html#concept_S3Origin

Дополнительная информация об использовании путей к каталогам S3 Bucket в качестве источника: https://aws.amazon.com/about-aws/whats-new/2014/12/16/amazon-cloudfront-now-allows-directory-path-as-origin-name/

Дополнительная информация о пользовательских URL-адресах: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html

0 голосов
/ 04 марта 2019

Это не полный ответ, но это слишком долго, чтобы быть комментарием.

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

Во-первых, нам нужно настроить конечную точку шлюза API, которая будет выступать в качестве прокси-сервера для S3.

У AWS очень подробное описание как сделатьобщий прокси для S3 , и я думаю, что вы можете настроить свою пользовательскую конечную точку на конкретную корзину и папку в S3, изменив PathOverride прокси.Если вы посмотрите на скриншот PathOverrides в этом разделе документации AWS, вы увидите, что они установили переопределение пути на {bucket}/{object}, но я думаю, что вы можете установить PathOverride на mySecretBucket/my/secret/folder/{object},и затем соответствующим образом обновите сопоставления путей.

Далее, вы должны иметь возможность использовать предварительно подписанные URL с этим прокси.Есть два способа, которыми вы могли бы сделать это.

Первое, что может сработать, - это заставить подпись URL-адреса проходить через API-шлюз к S3.Я знаю, что можно сопоставить параметры запроса аналогично параметрам пути.Возможно, вам придется выполнить некоторую кодировку URL для параметра подписи предварительно подписанного URL-адреса, чтобы он работал - я не совсем уверен.

Другой вариант - разрешить Api Gateway всегда выполнять запись в S3 и запрашивать подписанный запрос для вызова конечной точки прокси. На этот ТАК вопрос есть довольно подробный ответ, который, как мне кажется, должен работать.

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

...