سؤال كيف يمكنني الحصول على حجم دلو Amazon S3؟


أرغب في رسم حجم الرسم البياني (بالبايت ، وعدد عناصر #) من دلو Amazon S3 ، وأبحث عن طريقة فعالة للحصول على البيانات.

ال s3cmd توفر الأدوات طريقة للحصول على إجمالي حجم الملف باستخدام s3cmd du s3://bucket_name، لكنني قلق بشأن قدرتها على التوسع لأنها تبدو وكأنها تجلب بيانات حول كل ملف وتحسب المبلغ الخاص بها. ونظرًا لأن Amazon يفرض رسومًا على المستخدمين في GB-Months ، يبدو غريباً أنهم لا يعرضون هذه القيمة مباشرة.

برغم من Amazon REST API يعرض عدد العناصر في مجموعة بيانات ، s3cmd لا يبدو لفضحها. بإمكاني عمل s3cmd ls -r s3://bucket_name | wc -l ولكن هذا يبدو وكأنه اختراق.

الروبي AWS :: S3 بدت المكتبة واعدة ، ولكنها لا توفر سوى # عناصر الدلو ، وليس حجم الجرد الكلي.

هل هناك من يعرف أي أدوات أو مكتبات سطر أوامر أخرى (تفضل Perl أو PHP أو Python أو Ruby) التي توفر طرقًا للحصول على هذه البيانات؟


253
2017-11-15 00:40


الأصل


كتبت أداة لتحليل حجم الجرافة: github.com/EverythingMe/ncdu-s3 - omribahumi
أنا مندهش أن الأمازون المسؤول عن الفضاء ، ولكن لا توفر الحجم الإجمالي التي اتخذتها دلو S3 ببساطة من خلال لوحة S3. - Luke
بالنسبة لي ، استغرقت معظم الإجابات الواردة أدناه وقتًا طويلاً لاسترداد حجم الدلو ، إلا أن هذا النص الثعباني كان أسرع من معظم الإجابات - slsmk.com/getting-the-size-of-an-s3-bucket-using-boto3-for-aws - Vaulstein


الأجوبة:


يدعم AWS CLI الآن --query المعلمة التي تأخذ JMESPath التعبيرات.

هذا يعني أنه يمكنك جمع قيم الحجم التي تم تقديمها بواسطة list-objects استخدام sum(Contents[].Size) وعد مثل length(Contents[]).

يمكن تشغيل هذا باستخدام AWS CLI الرسمي كما هو موضح أدناه وتم إدخاله في فبراير 2014

 aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"

148
2017-11-16 23:00



بالنسبة إلى الدلاء الكبيرة (كبيرة الحجم) ، يكون هذا بطيئًا للغاية. أداة Python s4cmd "du" بسرعة البرق: s4cmd du s3://bucket-name - Brent Faust
هذا غريب. ما هو الوضع العام للدلو (الضحلة والدهنية / العميقة والرقيقة)؟ يبدو مثل s3cmd يجب أن يكون لها نفس المصاريف AWS CLI. في ال رمز يظهر  s3cmd تقديم طلب لكل دليل في مجموعة بيانات. - Christopher Hackett
للحصول عليه بتنسيق مقروء بشري: aws s3api --profile PROFILE_NAME list-objects --bucket BUCKET_NAME --output json --query "[sum(Contents[].Size), length(Contents[])]" | awk 'NR!=2 {print $0;next} NR==2 {print $0/1024/1024/1024" GB"}' - Sandeep
والآن بعد أن قدمت AWS Cloudwatch مقياسًا "BucketSizeBytes" لكل مجموعة ، لم يعد هذا هو الحل المناسب. انظر جواب توكاكوكان أدناه. - cce
s4cmd du رائع ، شكرًا لك @ Brent Faust! ملاحظة صغيرة (للمعنيين) التي تحتاج إلى إضافتها -r للحصول على أحجام الدلائل الفرعية أيضًا. - Greg Sadetsky


يمكن الآن القيام بذلك بشكل بسيط مع عميل سطر الأوامر الرسمي AWS فقط:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/

الوثائق الرسمية

هذا أيضًا يقبل بادئات المسار إذا كنت لا ترغب في حساب المجموعة بأكملها:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory

257
2017-09-09 14:04



هذا هو أفضل والإجابة حتى الآن - Tim
أوافق ، هذا هو أفضل إجابة. - Luis Artola
هذا بطيء جدًا بالنسبة إلى الدلاء مع العديد من الملفات لأنه يسرد جميع الكائنات في الدلو بشكل أساسي قبل عرض الملخص ، ومن حيث أنه ليس أسرع بشكل كبير من إجابةChristopher Hackett - باستثناء أن هذا واحد أكثر صخبًا. - Guss
تشغيل على نسخة EC2 مع نفس منطقة الجرافة لتحسين وقت الاستجابة - juanmirocks
إذا كنت مهتمًا فقط بحجم التلخيص ، فهذا هو الحل الأسرع والأحدث ، ويمكنك ببساطة التلويث عبر الذيل للعثور على تلك القيمة. - Charlie Hileman


AWS Console:

اعتبارا من 28 يوليو 2015 يمكنك الحصول على هذه المعلومات عبر CloudWatch. إذا كنت تريد واجهة المستخدم الرسومية ، انتقل إلى وحدة التحكم CloudWatch: (اختر المنطقة>) المقاييس> S3

قيادة AWS CLI:

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

 aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time 2015-07-15T10:00:00 --end-time 2015-07-31T01:00:00 --period 86400 --statistics Average --region eu-west-1 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=toukakoukan.com Name=StorageType,Value=StandardStorage

مهم: يجب تحديد كل من StorageType و BucketName في وسيطة الأبعاد وإلا لن تحصل على أية نتائج. كل ما تحتاج إلى تغيير هو --start-date، --end-timeو Value=toukakoukan.com.


في ما يلي برنامج نصي bash يمكنك استخدامه لتجنب الاضطرار إلى التحديد --start-date و --end-time يدويا.

#!/bin/bash
bucket=$1
region=$2
now=$(date +%s)
aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time "$(echo "$now - 86400" | bc)" --end-time "$now" --period 86400 --statistics Average --region $region --metric-name BucketSizeBytes --dimensions Name=BucketName,Value="$bucket" Name=StorageType,Value=StandardStorage

106
2017-07-31 21:58



أو في وحدة التحكم CloudWatch: (اختر المنطقة>) المقاييس> S3 - Halil Özgür
هذا هو الحل الأسهل والأسرع. للأسف ، لا تزال الإجابة في المرتبة الرابعة. - luk2302
لقد نجحت هذه العملية في دلو يحتوي على 10 ملايين كائن. لكن البرنامج النصي bash لم يرد أي شيء ، كان عليه أن يذهب إلى واجهة المستخدم الرسومية). - Petah
وتجدر الإشارة أيضًا إلى أنه سيتعين عليك تغيير المنطقة أيضًا - majikman
مايو 2018: أخطاء البرنامج النصي مع Invalid value ('1525354418') for param timestamp:StartTime of type timestamp - anneb


s3cmd تستطيع فعلها :

s3cmd du s3://bucket-name


103
2017-07-08 13:40



شكر. وهنا بعض التوقيت. على دلو يحتوي على نظام ملفات s3ql deduplicated مع حوالي مليون ملف باستخدام حوالي 33 غيغابايت من البيانات غير المألوفة ، وحوالي 93000 من كائنات s3 ، استغرق الأمر s3cmd du حوالي 4 دقائق لحساب الإجابة. أنا أشعر بالفضول لمعرفة كيف يقارن ذلك مع الطرق الأخرى مثل php التي تم وصفها في مكان آخر هنا. - nealmcb
إنها بطيئة لأن استدعاء S3 ListObjects API إرجاع الكائنات في صفحات من 1000 كائن. وبما أن I / O هو العامل المحدد ، أعتقد أن أي حل سيكون بطيئًا نسبيًا على 93000 كائن. - David Snabel-Caunt
s4cmd يمكن أن تفعل الشيء نفسه ، مع فائدة إضافية تتمثل في تعدد خيوط الطلبات لواجهة برمجة تطبيقات S3 لحساب النتيجة بشكل أسرع. لم يتم تحديث الأداة مؤخرًا ، ولكن قد يكتشفها أحد المارة عبر الإنترنت. - Nick Chammas
s4cmd يعود فقط 0 بالنسبة لي ، ويعود BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format. للدلاء ذات الأحرف الكبيرة. - Lakitu


إذا قمت بتنزيل تقرير الاستخدام، يمكنك رسم بياني للقيم اليومية لـ TimedStorage-ByteHrs حقل.

إذا كنت تريد هذا الرقم في GiB ، فقط القسمة على 1024 * 1024 * 1024 * 24 (هذا هو GiB- ساعات لدورة 24 ساعة). إذا كنت تريد الرقم بالبايت ، فقط قسّم على 24 والرسم البياني بعيدًا.


22
2017-12-05 17:22





باستخدام أدوات سطر الأوامر الرسمية AWS s3:

aws s3 ls s3://bucket/folder --recursive | awk 'BEGIN {total=0}{total+=$3}END{print total/1024/1024" MB"}'

18
2018-04-23 11:22



قدم رابطًا إلى المكان الذي يشير فيه الأمازون إلى هذا من فضلك. لا أستطيع العثور عليه. - lobi
docs.aws.amazon.com/cli/latest/index.html - dyltini
docs.aws.amazon.com/cli/latest/reference/s3/ls.html هو رابط أفضل - Ian Bamforth
عملت هذه الإجابة الأفضل والأسرع بالنسبة لي. - Miro
أفضل وأسرع الجواب! - PlagTag


s4cmd هي أسرع طريقة وجدتها (أداة مساعدة لسطر الأوامر مكتوبة في بايثون):

pip install s4cmd

الآن لحساب حجم الجرافة بأكمله باستخدام سلاسل عمليات متعددة:

s4cmd du -r s3://bucket-name

10
2018-03-31 22:12



لا، s4cmd du s3://123123drink لن يعيد ببساطة حجم الدلو. للحصول على حجم دلو قمت بإضافة متكررة -r، مثل هذا: s4cmd du -r s3: // 123123 - George Chalhoub
نعم ، نقطة جيدةBukLau (وأضاف -r على سبيل المثال أعلاه لتجنب الارتباك عندما يستخدم الناس مجلدات محاكاة على S3). - Brent Faust


اعتدت S3 REST / Curl API المدرجة في وقت سابق في هذا الموضوع وفعلت هذا:

<?php
if (!class_exists('S3')) require_once 'S3.php';

// Instantiate the class
$s3 = new S3('accessKeyId', 'secretAccessKey');
S3::$useSSL = false;

// List your buckets:
echo "S3::listBuckets(): ";
echo '<pre>' . print_r($s3->listBuckets(), 1). '</pre>';

$totalSize = 0;
$objects = $s3->getBucket('name-of-your-bucket');
foreach ($objects as $name => $val) {
    // If you want to get the size of a particular directory, you can do
    // only that.
    // if (strpos($name, 'directory/sub-directory') !== false)
    $totalSize += $val['size'];
}

echo ($totalSize / 1024 / 1024 / 1024) . ' GB';
?>

6
2017-12-12 19:05





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


4
2017-11-15 04:00



يبدو أن هذا هو الخيار الأفضل. سيتم تحديث هذه الوظيفة في المستقبل إذا ما تم قياسها بشكل سيئ وأحتاج إلى القيام بشيء آخر. كانت المكتبة التي انتهت بتوفير الوصول السهل إلى نتائج واجهة برمجة التطبيقات الأولية هي PHP one: undesigned.org.za/2007/10/22/amazon-s3-php-class - Garret Heaton
أليس هذا يقتصر على 1000 عنصر فقط؟ - Charlie Schliesser


... تأخرت قليلاً ولكن الطريقة الأفضل التي وجدتها هي استخدام التقارير في بوابة AWS. لقد أعددت درس PHP لتنزيل التقارير وتحليلها. مع ذلك ، يمكنك الحصول على إجمالي عدد الكائنات لكل مجموعة ، أو الحجم الإجمالي بالجيجابايت أو البايت ساعة وأكثر.

التحقق من ذلك واسمحوا لي أن أعرف إذا كان مفيدا

AmazonTools


4
2017-12-20 22:56



هذا هو الحل المثير للاهتمام ، على الرغم من أن القليل من الهاكرز. قلق حول ذلك كسر إذا / عندما تغير الأمازون موقعها ، ولكن قد تضطر إلى محاولة ذلك مرة واحدة لدي ما يكفي من الأشياء التي تصبح بطيئة للغاية الطريقة الأخرى. ومن الفوائد الأخرى لهذا النهج أنك لا تتحمل أي تكاليف على أي من مكالمات واجهة برمجة التطبيقات. - Garret Heaton
. . . هذا افتراض ، ولكن إذا كان الأمازون يغير مظهر موقعهم ، فأنا أشك في أنهم سيغيرون النهاية الخلفية كثيرًا ، وهذا يعني أن طلبات GET و POST الحالية يجب أن تعمل. سأحافظ على الصف في حالة حدوثه على أية حال بينما أستخدمه كثيرًا.