Aws-cli: Mendukung pembuatan URL yang ditandatangani untuk akses S3

Dibuat pada 2 Nov 2013  ·  40Komentar  ·  Sumber: aws/aws-cli

feature-request

Komentar yang paling membantu

Mengesankan - dalam 3 tahun alat CLI resmi tidak mendapatkan dukungan untuk mengimplementasikan url yang ditandatangani, meskipun ada di boto dan s3cmd

Semua 40 komentar

Ya, saya pikir ini akan menjadi fitur yang hebat. Saya pikir ini akan menjadi sub-perintah s3 baru? Saya telah mengerjakan beberapa perubahan internal pada kode perintah s3 untuk mempermudah penambahan subperintah. Saya telah menggunakan ini untuk mulai memfaktorkan ulang perintah ls untuk memperbaiki beberapa masalah yang dilaporkan dengan ls .

Belum sepenuhnya selesai, tapi inilah yang saya miliki sejauh ini:
https://github.com/jamesls/aws-cli/compare/s3-ls-permissions#diff -b88a66f4bd148577a9390cb980d7eeb9R321

Ya, ini yang saya cari. Tolong, izinkan untuk menentukan kedaluwarsa tidak hanya berdasarkan durasi, tetapi juga berdasarkan waktu tertentu. Memerlukan zona waktu UTC, format ISO, detik penuh, string yang diakhiri dengan "Z" menurut saya dapat digunakan dengan baik (misalnya "2014-05-30T00:00:00Z").

Jika, Anda benar-benar perlu membuat tmpurl dari baris perintah, saya dapat merekomendasikan alat baris perintah saya s3tmpgen

Bagaimanapun, saya benar-benar akan mengundang fungsionalitas seperti itu di AWS CLI, yang menjadi alat berharga untuk pekerjaan sehari-hari saya dengan AWS S3.

+1

+1

Saya ingin menggunakan S3 untuk meng-host bundel kode untuk digunakan ke Heroku dan ini akan menjadi fitur yang luar biasa :)

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

+1

+1 akan sangat bagus untuk memiliki ini di AWS CLI

Sekedar catatan untuk siapa saja yang berakhir di sini, Anda dapat melakukannya sendiri dengan mudah dengan menjangkau perpustakaan boto : https://boto.readthedocs.org/en/latest/ref/s3.html#boto .s3.key.Key.generate_url

Terima kasih untuk umpan baliknya. Saya akan melihat ini, saya setuju bahwa ini akan menjadi fitur hebat untuk ditambahkan ke AWS CLI.

Terima kasih, @johnboxall. Boto tentu saja merupakan pilihan, meskipun bagi orang-orang yang menggunakan biner cli tanpa penerapan Python asli (pikirkan pengguna Windows), menempuh rute itu sama baiknya dengan menurunkan PowerShell SDK dan melakukan sesuatu melalui .NET SDK. Masih ingin melihat asli ini di CLI. :menyeringai:

Hanya untuk siapa saja yang ingin menggunakan boto secara langsung untuk saat ini sampai ini ditambahkan ke aws-cli, saya pikir saya akan menambahkan instruksi contoh cepat. Saya sekarang telah mencari ini beberapa kali dan lebih suka memilikinya bersama dengan tiket ini dan komentar @johnboxall . Ini mungkin sangat jelas bagi sebagian orang, tetapi tidak untuk pengembang non-python

Pada kotak yang sudah menginstal 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'

Membangun contoh @isleshocky77 ... menambahkan argumen dan pemeriksaan kesalahan kecil:

Naskah

$ 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'

Contoh penggunaan dan bantuan

$ ./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

Halo semua
Setelah pemeriksaan lain tentang status masalah ini, saya memperbarui paket Python ttr.aws.utils.s3 yang menyediakan alat s3tmpgen . Pembaruan memungkinkan untuk menghasilkan url tidak hanya menggunakan https, tetapi (dengan opsi -http ) juga http.

Masih berharap untuk mengganti ini dengan solusi awscli.

:+1:

+1 untuk url yang ditandatangani s3 untuk menjadi bagian dari cli

:+1:

+1

Saya pikir, saya mengerti, mengapa butuh waktu lama: hal-hal harus terjadi secara berurutan dan hal yang baik adalah, sepertinya ada di peta jalan.

Karena AWS CLI didasarkan pada botocore , itu harus diselesaikan di sana terlebih dahulu. boto/botocore#291 memintanya.

Permintaan tarik boto/botocore#504 sudah digabung menjadi cabang clients-only dan peta jalan (disebutkan pada README di https://github.com/boto/botocore ) mengklaim, botocore saat ini hanya satu langkah sebelum menggabungkan cabang clients-only ke dalam pengembangan (kemudian beta, GA, dan AWS CLI memiliki alat "asli" untuk memberikan fungsionalitas bagi kami).

@vlcinsky

Ya, setelah cabang khusus klien digabung menjadi botocore, kami akan dapat mengambil generasi url yang ditandatangani di CLI. Kemudian, pekerjaan utama yang harus dilakukan di sisi CLI adalah membuat API bagus yang mengekspos fitur tersebut.

:+1: memang akan menjadi fitur yang berguna

+1

Seperti yang dicatat oleh @kyleknap , salah satu hal yang harus dilakukan adalah mendesain API yang bagus untuk fitur ini.

Saya melihat kasus penggunaan berikut:

  • "tmpGET": buat tmpurl untuk DAPATKAN permintaan
  • "tmpPOST": buat tmpurl untuk permintaan POST
  • "tmp???": apakah ada metode lain yang mendukung? Saya tidak mengetahui (dan tidak pernah menggunakan selain
    DAPATKAN dan POSTING)

"tmpGET" sangat mudah karena satu-satunya keluaran adalah url dan satu-satunya masukan adalah ember/kunci dan kedaluwarsa
tanggal (waktu kedaluwarsa).

"tmpPOST" jauh lebih kompleks karena seseorang harus menentukan kebijakan untuk memposting.

Satu pertanyaan untuk diselesaikan adalah, di mana harus menempatkan tindakan ini, tampaknya ada dua alternatif:

  • aws s3
  • aws s3api

Saya tidak akan berurusan hari ini dengan "tmpPOST" yang lebih kompleks dan akan fokus pada "tmpGET" yang lebih sederhana

Solusi cepat: tambahkan aws s3 tmpurl

Solusi seperti itu akan lebih mudah diterapkan, akan membantu dalam 80% dari kenyataan
gunakan situasi (terbitkan objek ke AWS S3 dan berikan url sementara untuk dibagikan
dengan seseorang).

Konsep ini akan dibangun di atas aws s3 ls dengan perbedaan berikut:

  • tambahkan opsi --expires untuk menentukan tanggal dan waktu kedaluwarsa url atau --expires-in ke
    tentukan jumlah detik hingga kedaluwarsa
  • hanya akan menampilkan tmpurls, satu baris per objek yang terdaftar

Saya khawatir, saat ini tidak ada cara mudah untuk membuat url tmp untuk waktu yang tepat, jadi inisial
versi hanya akan menawarkan opsi --expires-in dengan nilai default 3600 detik.

Pro dan kontra

kelebihan

Sangat mudah untuk membuat sekumpulan url tmp untuk sejumlah objek yang ada di AWS S3. Ini menghemat
rintangan dengan mendapatkan nilai nama ember/kunci yang tepat.

Kontra

Kerugian dari pendekatan berbasis aws s3 ls ini adalah, seseorang tidak dapat membuat tmp url untuk suatu objek, yang
belum ada.

Bagaimanapun, ini bisa diselesaikan nanti dengan solusi aws s3api .

Sangat baik diletakkan di sana. Sedangkan posting adalah sesuatu yang hampir pasti akan dibangun di sekitar beberapa penanganan sisi server dari data yang diposting, kasus penggunaan metode get biasanya jauh lebih mudah. Ketika Anda mengatakan itu akan mencakup sebagian besar kasus penggunaan, saya akan sangat setuju.

Saya bermaksud menambahkan, saya tidak berpikir URL temp harus ada hubungannya dengan mencari file di s3. Jika seseorang ingin membuat seluruh rangkaian URL yang ditandatangani, itu logika cli tidak perlu berbuat lebih banyak untuk membungkus. Primitif tmpurl adalah produk minimum yang layak dalam pikiran saya .

Saya telah menerapkan (tidak sepenuhnya) URL pra-sgin untuk objek s3 di cabang lokal saya.

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

Ini adalah pembungkus tipis untuk botocore.generate_presigned_url , dan belum siap produksi. Seperti yang dicatat oleh @vlcinsky , kita membutuhkan desain API yang bagus sebagai AWSCLI . Setelah itu diperbaiki, saya bisa mengimplementasikannya.

Satu hal yang saya perhatikan adalah bahwa generate_presigned_url memerlukan parameter client_method , yang menentukan S3 API(misalnya get_object ) untuk mendaftar. Dalam implementasi saya saat ini, itu terbuka untuk pengguna, tetapi akan lebih baik untuk menjadi ramah pengguna, seperti memberikan sub-perintah yang berbeda( aws s3 geturl , aws s3 uploadurl ) atau beralih opsi( --type upload )

Penggunaan

unggah objek ke 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

dapatkan objek dari 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 di atas menghasilkan url seperti: 'https://.s3.amazonaws.com/dir/dir/file

Ketika saya mencoba untuk menggulung file, saya mendapatkan masalah sertifikat SSL: Rantai sertifikat tidak valid
Jika saya meringkuk dengan opsi -k, saya bisa melewati ini, tetapi saya juga tahu bahwa jika urlnya terlihat seperti: ' https://s3-.amazonaws.com//dir/dir/file'
sertifikatnya valid, apakah ada cara untuk mengubah url, atau perbaikan lainnya?
Terima kasih,
Garry

misalnya: ' https://s3-us-west-1.amazonaws.com/bucket/dir/dir/file '

Perbarui, menggunakan boto3 dapat menghasilkan url yang ditandatangani dengan benar.

+1

Mengesankan - dalam 3 tahun alat CLI resmi tidak mendapatkan dukungan untuk mengimplementasikan url yang ditandatangani, meskipun ada di boto dan s3cmd

1+

+1

+1

Ada pembaruan tentang ini? Terkejut ini belum tersedia.

+1

Saya menulis satu sebagai solusi dan berfungsi seperti yang diharapkan: https://github.com/gdbtek/aws-tools

Halo semuanya, terima kasih atas umpan baliknya. Ini sesuatu yang ada di backlog kami. Saya belum memiliki tanggal pasti, tetapi saya akan menautkan ke masalah ini setelah kami mengajukan permintaan penarikan.

Besar! Terima kasih!

Apakah mungkin untuk mendapatkan url yang telah ditentukan ke seluruh folder s3? Termasuk antarmuka web untuk menavigasi folder?

@tommeda Tidak mungkin. url yang telah ditandatangani sebelumnya selalu terkait dengan objek tunggal yang disimpan. Apa yang Anda bicarakan mirip dengan situs web statis tetapi untuk mengontrol akses ke sana (jika berdasarkan AWS S3), seseorang harus menulis beberapa proxy. Beberapa upaya sudah ada, tidak ada yang menurut saya (meneliti sekitar setahun yang lalu) mudah.

Anda selalu dapat membuat halaman web yang menyediakan antarmuka ke dan menyertakan url yang telah ditandatangani sebelumnya untuk setiap objek, lalu memasukkan antarmuka ke s3 dan mengembalikan url yang telah ditandatangani sebelumnya ke antarmuka. Tidak terlalu mudah, dan antarmuka ingin penggunaan khusus

Apakah halaman ini membantu?
0 / 5 - 0 peringkat