Да, я думаю, это была бы отличная функция. Думаю, это будет новая подкоманда 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, который предоставляет эту функцию.
https://github.com/boto/botocore/issues/291 уже был закрыт 23 июня: «В настоящее время функция доступна в ботокоре».
: +1: действительно была бы удобная функция
+1
Как отметил @kyleknap , одна из вещей, которые нужно сделать, - это разработать хороший API для этой функции.
Я вижу следующие варианты использования:
"TmpGET" действительно прост, так как единственный вывод - это url, а единственный ввод - это корзина / ключ и срок действия.
дата (срок действия).
«TmpPOST» намного сложнее, так как нужно определить политику для публикации.
Один вопрос, который нужно решить, заключается в том, где разместить эти действия, кажется, есть две альтернативы:
aws s3
aws s3api
Я не буду сегодня касаться более сложного «tmpPOST», а сосредоточусь на более простом «tmpGET».
aws s3 tmpurl
Такое решение было бы довольно легко реализовать, помогло бы в 80% реальных
использовать ситуации (опубликовать объект в AWS S3 и предоставить временный URL-адрес для совместного использования
с кем-то).
Концепция будет основана на существующем aws s3 ls
со следующими отличиями:
--expires
для определения даты и времени истечения срока действия URL или --expires-in
вБоюсь, в настоящее время нет простого способа создать 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
)
$ 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
$ 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: //
Когда я пытаюсь скрутить файл, у меня возникает проблема с сертификатом SSL: неверная цепочка сертификатов.
Если я скручу с опцией -k, я смогу обойти это, но я также знаю, что если URL-адрес выглядит так: ' https: // s3-
сертификат действителен, есть ли способ изменить 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-адрес в интерфейс. Не совсем просто, и интерфейс хотел бы быть специфичным для использования
Самый полезный комментарий
Впечатляет - за 3 года официальный инструмент CLI не получил поддержки подписанного URL- адреса, несмотря на то , что он существует в s3cmd.