Aws-cli: Поддержка создания подписанных URL-адресов для доступа S3

Созданный на 2 нояб. 2013  ·  40Комментарии  ·  Источник: aws/aws-cli

feature-request

Самый полезный комментарий

Впечатляет - за 3 года официальный инструмент CLI не получил поддержки подписанного URL- адреса, несмотря на то , что он существует в s3cmd.

Все 40 Комментарий

Да, я думаю, это была бы отличная функция. Думаю, это будет новая подкоманда s3? Я работал над некоторыми внутренними изменениями в коде команды s3, чтобы упростить добавление подкоманд. Я использовал это, чтобы начать рефакторинг команды ls чтобы исправить несколько обнаруженных проблем с ls .

Еще не совсем готово, но вот что у меня есть:
https://github.com/jamesls/aws-cli/compare/s3-ls-permissions#diff -b88a66f4bd148577a9390cb980d7eeb9R321

Да, это я искал. Пожалуйста, разрешите указывать истечение не только по длительности, но и по конкретному datetime. Требуется часовой пояс UTC, формат ISO, полные секунды, строка, оканчивающаяся на «Z», кажется мне удобной для использования (например, «2014-05-30T00: 00: 00Z»).

В случае, если вам действительно нужно сгенерировать tmpurl из командной строки, я мог бы порекомендовать свой инструмент командной строки s3tmpgen

В любом случае, я бы действительно пригласил такую ​​функциональность в AWS CLI, которая стала ценным инструментом для моей повседневной работы с AWS S3.

+1

+1

Я хочу использовать S3 для размещения пакетов кода для развертывания на Heroku, и это было бы отличной функцией :)

https://blog.heroku.com/archives/2014/5/22/introduction_the_app_json_application_manifest

+1

+1 было бы здорово иметь это в AWS CLI

Просто примечание для всех, кто здесь окажется: вы можете сделать это самостоятельно, залезя в библиотеку boto : https://boto.readthedocs.org/en/latest/ref/s3.html#boto .s3.key.Key.generate_url

Спасибо за ответ. Я посмотрю на это, я согласен, что это было бы отличной функцией для добавления в AWS CLI.

Спасибо, @johnboxall. Boto - это, безусловно, вариант, хотя для людей, развертывающих двоичный файл cli без развертывания собственного Python (подумайте о пользователях Windows), идти по этому пути - это столько же работы, сколько вытаскивать PowerShell SDK и делать что-то через .NET SDK. Хотелось бы еще увидеть этот родной в CLI. :ухмылка:

Просто для тех, кто хочет прямо сейчас использовать boto, пока он не будет добавлен в aws-cli, я решил добавить краткую примерную инструкцию. Я уже пару раз искал это и предпочел бы иметь его вместе с этим билетом и комментарием @johnboxall . Для некоторых это может быть чрезвычайно очевидно, но не для разработчиков, не использующих Python.

На коробке, в которой уже установлен питон

$ python --version
Python 2.7.6
$ sudo pip install boto
$ python
>>> import boto
>>> s3 = boto.connect_s3()
>>> bucket = s3.get_bucket('your-bucket-name')
>>> key = bucket.get_key('the-prefix/the-name-of-the-object.mp4')
>>> key.generate_url(3600)
'https://your-bucket-name.s3.amazonaws.com/the-prefix/the-name-of-the-object.mp4?Signature=CgDfFa45DBXFiMfASxSTpiSuHKM%3D&Expires=1415913273&AWSAccessKeyId=ABCDEDKSY344ACVDG'

Основываясь на примере @ isleshocky77 ... добавление аргументов и проверка мелких ошибок:

Сценарий

$ cat boto-get-signed-url.py
#!/usr/bin/python
import boto
import argparse

parser = argparse.ArgumentParser(description='Generate an S3 signed URL')
parser.add_argument('-b', '--bucket', help='bucket name')
parser.add_argument('-k', '--key', help='prefix/key')
parser.add_argument('-s', '--seconds', type=int, help='time in seconds until the URL will expire')
args = parser.parse_args()

s3 = boto.connect_s3()
bucket = s3.get_bucket(args.bucket)
key = bucket.get_key(args.key)
if bucket.get_key(args.key):
  print key.generate_url(args.seconds)
else:
  print 's3://' + args.bucket + '/' + args.key + ' does not exist'

Пример использования и помощь

$ ./boto-get-signed-url.py -b superbucket -k "test" -s 60
https://superbucket.s3.amazonaws.com/test?Signature=n6cO8RH%2FbNwQhuZVNNazo3q04x0%3D&Expires=1416695021&AWSAccessKeyId=AKIEXAMPLEKEYNOTREAL

$ boto-get-signed-url.py --help
usage: boto-get-signed-url.py [-h] [-b BUCKET] [-k KEY] [-s SECONDS]

Generate an S3 signed URL

optional arguments:
  -h, --help            show this help message and exit
  -b BUCKET, --bucket BUCKET
                        bucket name
  -k KEY, --key KEY     prefix/key
  -s SECONDS, --seconds SECONDS
                        time in seconds until the URL will expire

всем привет
После очередной проверки статуса этой проблемы я обновил пакет Python ttr.aws.utils.s3, предоставив инструмент s3tmpgen . Обновление позволяет генерировать URL-адрес не только с использованием https, но (с опцией -http ) также http.

Все еще с нетерпением жду возможности заменить это на решение awscli.

: +1:

+1, чтобы подписанный URL-адрес s3 стал частью cli

: +1:

+1

Я думаю, я понимаю, почему это занимает так много времени: все должно происходить по порядку, и хорошо, что это похоже на дорожную карту.

Поскольку интерфейс командной строки AWS основан на botocore , сначала он должен быть разрешен там. boto / botocore # 291 просит об этом.

Запрос на вытягивание boto / botocore # 504 уже был объединен с веткой clients-only и утвержден дорожной картой (упомянутой в README на https://github.com/boto/botocore), ботокор в настоящее время находится всего в одном шаге перед объединением ветки clients-only в разработку (тогда у бета-версии, GA и AWS CLI есть «собственный» инструмент, обеспечивающий нам функциональность).

@vlcinsky

Да, как только ветка только для клиентов будет объединена с ботокором, мы сможем получить генерацию подписанных URL-адресов в интерфейсе командной строки. Затем основной объем работы, который необходимо будет выполнить на стороне CLI, - это создать хороший API, который предоставляет эту функцию.

: +1: действительно была бы удобная функция

+1

Как отметил @kyleknap , одна из вещей, которые нужно сделать, - это разработать хороший API для этой функции.

Я вижу следующие варианты использования:

  • "tmpGET": создать tmpurl для запроса GET
  • "tmpPOST": создать tmpurl для запроса POST
  • "tmp ???": есть ли еще какой-нибудь способ поддержки? Я не знаю (и никогда не использовал, кроме
    ПОЛУЧИТЬ и ОТПРАВИТЬ)

"TmpGET" действительно прост, так как единственный вывод - это url, а единственный ввод - это корзина / ключ и срок действия.
дата (срок действия).

«TmpPOST» намного сложнее, так как нужно определить политику для публикации.

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

  • aws s3
  • aws s3api

Я не буду сегодня касаться более сложного «tmpPOST», а сосредоточусь на более простом «tmpGET».

Быстрое решение: добавить aws s3 tmpurl

Такое решение было бы довольно легко реализовать, помогло бы в 80% реальных
использовать ситуации (опубликовать объект в AWS S3 и предоставить временный URL-адрес для совместного использования
с кем-то).

Концепция будет основана на существующем aws s3 ls со следующими отличиями:

  • добавьте опцию --expires для определения даты и времени истечения срока действия URL или --expires-in в
    указать количество секунд до истечения срока
  • выводит только tmpurls, по одной строке на указанный объект

Боюсь, в настоящее время нет простого способа создать URL-адрес tmp для точного момента времени, поэтому начальный
версия будет предлагать только вариант --expires-in со значением по умолчанию 3600 секунд.

За и против

Плюсы

Создать группу tmp-адресов для количества существующих объектов на AWS S3 очень просто. Это спасает
препятствие для получения точных значений имени сегмента / ключа.

Минусы

Недостатком этого подхода на основе aws s3 ls является то, что нельзя создать tmp url для объекта, который
еще не существует.

В любом случае, позже это может быть решено с помощью решения aws s3api .

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

Однако я хотел добавить, что не думаю, что временный URL-адрес должен иметь какое-либо отношение к размещению файлов на s3. Если кто-то хочет сгенерировать целые наборы подписанных URL-адресов, по этой логике cli не нужно делать больше для переноса. На мой взгляд, примитив tmpurl - это минимально жизнеспособный продукт.

Я реализовал (не полностью) предварительно настроенный URL-адрес для объектов s3 в моей локальной ветке.

https://github.com/quiver/aws-cli/tree/s3-presigned-url

Это тонкая оболочка для botocore.generate_presigned_url , и она еще не готова к производству. Как заметил @vlcinsky , нам нужен хороший дизайн API как AWSCLI . Как только это будет исправлено, я смогу это реализовать.

Я заметил, что generate_presigned_url требует параметра client_method , который указывает S3 API (например, get_object ) для подписи. В моей текущей реализации он доступен для пользователя, но было бы лучше, чтобы он был удобен для пользователя, например, предоставлял различные подкоманды ( aws s3 geturl , aws s3 uploadurl ) или параметры переключения ( --type upload )

использование

загружать объекты в S3

$ echo hello world > test.txt

$ aws s3 url s3://BUCKET/test.txt --client-method put_object --expires-in 180
https://BUCKET.s3.amazonaws.com/test.txt?AWSAccessKeyId=AKIAIXXXXXXXXXXXXXXX&Expires=1451449621&Signature=KgwO9lBx942fFvln0JW0NX7mKS0%3D

$ URL=`aws s3 url s3://BUCKET/test.txt --client-method put_object --expires-in 180`

$ curl -D - -X PUT --upload-file test.txt $URL
HTTP/1.1 100 Continue

HTTP/1.1 200 OK
x-amz-id-2: /90B1axPysBg3P8kv8BlR8RoqdO1JfajCN5BM5/TxIT3VjGphKmyGX8EgCQEtCXYhuNkVne5+GM=
x-amz-request-id: 685F03CA6C84FAC0
Date: Wed, 30 Dec 2015 05:18:38 GMT
ETag: "6f5902ac237024bdd0c176cb93063dc4"
Content-Length: 0
Server: AmazonS3

$ aws s3 cp s3://BUCKET/test.txt -
hello world

получить объекты из S3

$ URL=`aws s3 url s3://BUCKET/test.txt --client-method get_object --expires-in 180`

$ curl -D - -X GET $URL
HTTP/1.1 200 OK
x-amz-id-2: WuRokcBm9wnDMaRkD8kNeGijuKEzVp3eagi7JbpPXmmchEljsiP4wZX5w1TaeuK94n2526FGKMI=
x-amz-request-id: 1EBCAA7A691A577D
Date: Wed, 30 Dec 2015 05:20:14 GMT
Last-Modified: Wed, 30 Dec 2015 05:19:15 GMT
ETag: "6f5902ac237024bdd0c176cb93063dc4"
Accept-Ranges: bytes
Content-Type: binary/octet-stream
Content-Length: 12
Server: AmazonS3

hello world

Вышеупомянутый python генерирует URL-адрес вроде: 'https: //.s3.amazonaws.com / каталог / каталог / файл

Когда я пытаюсь скрутить файл, у меня возникает проблема с сертификатом SSL: неверная цепочка сертификатов.
Если я скручу с опцией -k, я смогу обойти это, но я также знаю, что если URL-адрес выглядит так: ' https: // s3-.amazonaws.com // каталог / каталог / файл '
сертификат действителен, есть ли способ изменить URL-адрес или другое исправление?
Спасибо,
Гарри

например: ' https://s3-us-west-1.amazonaws.com/bucket/dir/dir/file '

Обновление, с помощью boto3 удалось сгенерировать правильно подписанный URL-адрес.

+1

Впечатляет - за 3 года официальный инструмент CLI не получил поддержки подписанного URL- адреса, несмотря на то , что он существует в s3cmd.

1+

+1

+1

Есть новости по этому поводу? Удивлен, что это еще не доступно.

+1

Я написал один как обходной путь и работает как ожидалось: https://github.com/gdbtek/aws-tools

Всем привет, спасибо за отзыв. Это то, что находится в нашей очереди. У меня пока нет точных дат, но я дам ссылку на эту проблему, как только у нас будет запрос на перенос.

Большой! Спасибо!

Можно ли получить заранее заданный URL-адрес для всей папки s3? Включая веб-интерфейс для навигации по папке?

@tommeda Невозможно. предварительно подписанный URL-адрес всегда связан с одним сохраненным объектом. То, о чем вы говорите, похоже на статический веб-сайт, но для управления доступом к нему (если он основан на AWS S3), нужно написать прокси. Уже существует несколько попыток, ни одна из них не показалась мне (исследованной около года назад) легкой и легкой.

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги