Aws-cli: دعم إنشاء عناوين URL الموقعة للوصول إلى S3

تم إنشاؤها على ٢ نوفمبر ٢٠١٣  ·  40تعليقات  ·  مصدر: aws/aws-cli

feature-request

التعليق الأكثر فائدة

مثير للإعجاب - خلال 3 سنوات لم تحصل أداة CLI الرسمية على دعم لعنوان url الموقع ، على الرغم من وجودها في boto و

ال 40 كومينتر

نعم ، أعتقد أن هذه ستكون ميزة رائعة. أعتقد أن هذا سيكون أمرًا فرعيًا جديدًا لـ s3؟ لقد كنت أعمل على بعض التغييرات الداخلية في كود الأمر s3 لتسهيل إضافة الأوامر الفرعية. لقد كنت أستخدم هذا لبدء إعادة بناء الأمر ls لإصلاح العديد من المشكلات التي تم الإبلاغ عنها مع ls .

لم يتم الانتهاء منه بالكامل بعد ، ولكن إليكم ما لدي حتى الآن:
https://github.com/jamesls/aws-cli/compare/s3-ls-permissions#diff -b88a66f4bd148577a9390cb980d7eeb9R321

نعم ، هذا ما كنت أبحث عنه. من فضلك ، اسمح بتحديد انتهاء الصلاحية ليس فقط بالمدة ، ولكن أيضًا بالوقت المحدد. تتطلب المنطقة الزمنية 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/introducing_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 ، فقد اكتشفت أنني سأضيف تعليمة عينة سريعة. لقد ذهبت الآن للبحث عن هذا عدة مرات وأفضل الحصول عليه مع هذه التذكرة وتعليق

على صندوق تم تثبيت بيثون عليه بالفعل

$ 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 CLI يعتمد على botocore ، فسيتم حلها هناك أولاً. يطلب boto / botocore # 291 ذلك.

تم دمج طلب السحب boto / botocore # 504 بالفعل في الفرع clients-only وخريطة الطريق (المذكورة في README على https://github.com/boto/botocore) ، botocore حاليًا خطوة واحدة فقط قبل دمج الفرع clients-only قيد التطوير (ثم يكون لدى الإصدار التجريبي ، GA و AWS CLI أداة "أصلية" لتوفير وظائف لنا).

تضمين التغريدة

نعم بمجرد دمج فرع العملاء فقط في botocore ، سنتمكن من التقاط إنشاء عناوين url الموقعة في CLI. بعد ذلك ، فإن مقدار العمل الرئيسي الذي يجب القيام به على جانب CLI هو إنشاء واجهة برمجة تطبيقات جيدة تعرض الميزة.

: +1: ستكون ميزة مفيدة بالفعل

+1

كما لاحظ kyleknap ، فإن أحد الأشياء التي يجب القيام بها هو تصميم واجهة برمجة تطبيقات جيدة لهذه الميزة.

أرى حالات الاستخدام التالية:

  • "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 to
    حدد عدد الثواني حتى انتهاء الصلاحية
  • ستخرج فقط tmpurls ، سطر واحد لكل كائن مدرج

أخشى أنه لا توجد حاليًا طريقة سهلة لإنشاء عنوان url tmp للحظة من الزمن ، لذا فهي أولية
سيقدم الإصدار الخيار --expires-in مع القيمة الافتراضية 3600 ثانية.

إيجابيات وسلبيات

الايجابيات

من السهل جدًا إنشاء مجموعة من عناوين url الخاصة بـ tmp لعدد من العناصر الموجودة على AWS S3. يحفظ ملف
عقبة مع الحصول على القيم الدقيقة للحاوية / اسم المفتاح.

سلبيات

عيب هذا النهج القائم على aws s3 ls هو أنه لا يمكن للمرء إنشاء عنوان url tmp لكائن ، والذي
غير موجود بعد.

على أي حال ، يمكن حل هذا لاحقًا عن طريق حل 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 ، نحتاج إلى تصميم واجهة برمجة تطبيقات جيد مثل AWSCLI . بمجرد إصلاح ذلك يمكنني تنفيذ ذلك.

شيء واحد ألاحظه هو أن generate_presigned_url يتطلب معلمة client_method ، والتي تحدد واجهة برمجة تطبيقات S3 (على سبيل المثال 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 الموقع ، على الرغم من وجودها في boto و

1+

+1

+1

أي تحديث على هذا؟ مندهش من أن هذا غير متوفر حتى الآن.

+1

لقد كتبت واحدًا كحل بديل ويعمل كما هو متوقع: https://github.com/gdbtek/aws-tools

مرحبا بالجميع ، شكرا على ردود الفعل. هذا شيء موجود على عملنا المتراكم. ليس لدي تواريخ محددة حتى الآن ، لكنني سأربط هذه المشكلة بمجرد أن يكون لدينا طلب سحب.

رائعة! شكرا!

هل من الممكن الحصول على عنوان url مخصص لمجلد s3 بأكمله؟ بما في ذلك واجهة ويب للتنقل عبر المجلد؟

tommeda غير ممكن. يرتبط عنوان url الموقع مسبقًا دائمًا بكائن واحد مخزن. ما تتحدث عنه مشابه لموقع الويب الثابت ولكن للتحكم في الوصول إليه (إذا كان يعتمد على AWS S3) ، يتعين على المرء كتابة بعض الوكيل. توجد محاولات قليلة بالفعل ، ولم يبد لي أي منها (أجريت بحثًا منذ حوالي عام) أمرًا سهلاً.

يمكنك دائمًا إنشاء صفحة ويب توفر واجهة لعناوين url الموقعة مسبقًا لكل كائن وتضمينها ، ثم وضع الواجهة في s3 وإرجاع عنوان url موقّع مسبقًا إلى الواجهة. ليس الأمر سهلًا تمامًا ، وستريد الواجهة أن تكون محددة الاستخدام

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات