Как создать предварительно подписанный URL-адрес S3 для пользовательского домена, не раскрывая имя корзины - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть корзина my-bucket-name, и я хочу предоставить временный доступ к некоторым file.pdf в folder-name. По умолчанию я получаю следующую ссылку, используя boto3:

https://my-bucket-name.s3.amazonaws.com/folder-name/file.pdf?AWSAccessKeyId=<key>&Signature=<signature>&x-amz-security-token=<toke>&Expires=<time>

Но также у меня есть псевдоним DNS, my.address.com сопоставлен с my-bucket-name.s3.amazonaws.com. Конечно, если я использую это непосредственно, я получил SignatureDoesNotMatch от Амазонки. Поэтому я использую следующий код для генерации предварительно подписанной ссылки:

from botocore.client import Config

kwargs = {}
kwargs['endpoint_url'] = f'https://my.address.com'
kwargs['config'] = Config(s3={'addressing_style': 'path'})

s3_client = boto3.client('s3', **kwargs)
url = s3_client.generate_presigned_url(ClientMethod='get_object',
                                       Params={
                                          'Bucket': 'my-bucket-name',
                                          'Key': 'folder-name/file.pdf'
                                       },
                                       ExpiresIn=URL_EXPIRATION_TIME)

В результате он возвращает мне следующую ссылку:

https://my.address.com/my-bucket-name/folder-name/file.pdf?AWSAccessKeyId=<key>&Signature=<signature>&x-amz-security-token=<toke>&Expires=<time>

С этим связаны две проблемы:

  • Я не хочу раскрывать имя своего сегмента, поэтому my-bucket-name/ следует опустить
  • Эта ссылка не работает, я получаю
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>

Вот эти вопросы:

  1. Можно ли получить работоспособную ссылку, не раскрывая имя корзины?
  2. Я уже читал кое-что о том, что пользовательские домены только возможно для HTTP, а не для доступа HTTPS, это правда? Что мне делать в этом случае?
  3. Псевдоним DNS не был сделан мной, поэтому я не уверен, работает ли он или настроен правильно, что я должен проверить / попросить, чтобы убедиться, что он будет работать на s3?

В настоящее время я немного потерян в документах Amazon. Также я новичок во всем этом AWS материал.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Невозможно скрыть имя корзины в предварительно подписанном URL-адресе Amazon S3. Это потому, что запрос делается в ведро. Подпись просто авторизует запрос.

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

Amazon CloudFront поддерживает предварительно подписанные URL-адреса. Вы можете предоставить CloudFront доступ к корзине S3 с помощью Origin Access Identity (OAI) , а затем настроить распространение как частное. Затем получите доступ к контенту через предварительно подписанные URL-адреса CloudFront. Обратите внимание, что весь контент дистрибутива будет закрытым, поэтому вам потребуется либо два дистрибутива CloudFront (один публичный c, один приватный), либо использовать CloudFront только для приватной части (и продолжать использовать direct-to-S3 для часть publi c).

Если весь веб-сайт является частным, вы можете использовать повар ie с CloudFront вместо создания предварительно подписанных URL-адресов для каждого URL-адреса.

0 голосов
/ 12 февраля 2020

Насколько я знаю, вы не можете иметь предварительно подписанный URL, не раскрывая имя корзины. Да, вы не можете получить доступ к пользовательскому имени домена, сопоставленному с URL-адресом корзины S3, через https. Поскольку при доступе к https://example.com и example.com сопоставляется my-bucket-name.s3.amazonaws.com, S3 не может расшифровать трафик SSL c. См. эту AWS страницу документации, раздел Ограничения.

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