كيفية استعادة المجلدات (أو المجموعات بأكملها) إلى Amazon S3 من Glacier؟

StackOverflow https://stackoverflow.com//questions/20033651

سؤال

لقد قمت بتغيير دورة الحياة لمجموعة من الجرافات الخاصة بي على Amazon S3 لذلك تم تعيين فئة التخزين الخاصة بها على Glacier.لقد فعلت ذلك باستخدام وحدة تحكم AWS عبر الإنترنت.أنا الآن بحاجة إلى تلك الملفات مرة أخرى.

أعرف كيفية استعادتها مرة أخرى إلى S3 لكل ملف.لكن مجموعاتي تحتوي على آلاف الملفات.كنت أرغب في معرفة ما إذا كانت هناك طريقة لاستعادة المجموعة بأكملها إلى S3، تمامًا كما كانت هناك طريقة لإرسال المجموعة بأكملها إلى Glacier؟

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

هل كانت مفيدة؟

المحلول

لا توجد أداة مدمجة لهذا."مجلدات" في S3 هي وهم للراحة البشرية، بناء على خطوط مائلة للأمام في مفتاح الكائن (المسار / اسم الملف) وكل كائن يتراجع إلى الجلاد يجب استعادته بشكل فردي، على الرغم من ...

بالطبع يمكنك كتابة برنامج نصي للتكرار من خلال التسلسل الهرمي وإرسال طلبات استعادة تلك باستخدام SDKS أو API بقية في لغة البرمجة المفضلة لديك.

تأكد من أنك تفهم كيف استعادت من Glacier في أعمال S3، قبل المتابعة.فهو دائما استعادة مؤقتة فقط، واختر عدد الأيام التي يستمر فيها كل كائن في S3 قبل الرجوع مرة أخرى ليتم تخزينها فقط في Glacier.

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

نصائح أخرى

إذا كنت تستخدم s3cmd يمكنك استخدامه للاستعادة بشكل متكرر بسهولة تامة:

s3cmd restore --recursive s3://mybucketname/ 

لقد استخدمته أيضًا لاستعادة المجلدات فقط:

s3cmd restore --recursive s3://mybucketname/folder/

إذا كنت تستخدم أداة AWS CLI (هذا جميل، يجب عليك ذلك)، يمكنك القيام بذلك على النحو التالي:

aws s3 ls s3://<bucket_name> | awk '{print $4}' | xargs -L 1 aws s3api restore-object --restore-request Days=<days> --bucket <bucket_name> --key

يستبدل <bucket_name> مع اسم الدلو الذي تريده.

يستبدل <days> مع عدد الأيام التي تريد استعادة الكائن لها.

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

  1. احصل على قائمة بجميع الملفات الجليدية (مفاتيح) في دلو

    aws s3api list-objects-v2 --bucket <bucketName> --query "Contents[?StorageClass=='GLACIER']" --output text | awk '{print $2}' > glacier-restore.txt

  2. قم بإنشاء برنامج نصي شل وتشغيله، واستبدال "Bucketname" الخاص بك.

    giveacodicetagpre
  3. الائتمان يذهب إلى Josh at http://capnjosh.com/blog/a-client-error-invidedobjectate-ockurred-when-calling-copyobject-operation -Operation-of-of-of-of-of-of-of-of-the-source-saless-stricle-class / ، وهو مورد وجدته بعد محاولة بعض الحلول المذكورة أعلاه.

كنت بحاجة مؤخرا لاستعادة دلو كامل وجميع ملفاتها ومجلداتها.ستحتاج إلى أدوات S3cmd و AWS CLI التي تم تكوينها بأوراق اعتمادك لتشغيل هذا.

لقد وجدت هذه قوية للغاية للتعامل مع الأخطاء مع كائنات محددة في دلو قد يكون لها طلب استعادة بالفعل.

giveacodicetagpre.

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

# Parameters
BUCKET="my-bucket" # the bucket you want to restore, no s3:// no slashes
BPATH="path/in/bucket/" # the objects prefix you wish to restore (mind the `/`) 
DAYS=1 # For how many days you wish to restore the data.

# Restore the objects
aws s3 ls s3://{BUCKET}/${BPATH} --recursive | \
awk '{out=""; for(i=4;i<=NF;i++){out=out" "$i}; print out}'| \
xargs -I {} aws s3api restore-object --restore-request Days={DAYS} \
--bucket {BUCKET} --key "{}"

يبدو وكأنه متصفح S3 يمكن "استعادة من Glacier" في مستوى المجلد، ولكن ليس مستوى دلو.الشيء الوحيد هو أن لديك لشراء نسخة الموالية.لذلك ليس الحل الأفضل.

تباين على إجابة Dustin لاستخدام AWS CLI، ولكن لاستخدام Recursion والأنابيب إلى SH لتخطي الأخطاء (مثل إذا كانت بعض الكائنات قد طلبت بالفعل استعادة ...)

giveacodicetagpre.

يتنوع بت صدى Xargs قائمة بأوامر "AWS S3API Restore-Object" والأنابيب التي يجب أن تستمر في الخطأ.

ملاحظة: حزمة Ubuntu 14.04 AWS-CLI القديم.من أجل استخدام --recursive، ستحتاج إلى تثبيت عبر Github.

postscript: يمكن الحصول على استعادة الجليدية الثمن بشكل غير متوقع بسرعة كبيرة. اعتمادا على حالة استخدامك، قد تجد منافس الوصول النادر ليكون أكثر ملاءمة. AWS لديك تفسير لطيف من الطبقات المختلفة.

طريقة أخرى هي Rclone.هذه الأداة يمكن مزامنة / نسخ البيانات / دفع (مثلما يمكننا أن نفعل مع الملفات). noreferrer"> https://rclone.org/faq/#CAN-RCLONE-SYNC-FIRE-FIRE-DIVERT-TO-S3 (مثال الرابط مخصص ل Google Drive، ولكن هذا هو Agnostique).ولكن كما قال مايكل - Sqlbot، يجب على الخادم أو الحاوية بدء تشغيل عملية المزامنة / النسخ الاحتياطي في مكان ما.

هذا الأمر يعمل بالنسبة لي:

aws s3api list-objects-v2 \
--bucket BUCKET_NAME \
--query "Contents[?StorageClass=='GLACIER']" \
--output text | \
awk -F $'\t' '{print $2}' | \
tr '\n' '\0' | \
xargs -L 1 -0 \
aws s3api restore-object \
--restore-request Days=7 \
--bucket BUCKET_NAME \
--key

نصيحة محترف

  • يمكن أن يستغرق هذا الأمر بعض الوقت إذا كان لديك الكثير من الكائنات.
  • لا تقم CTRL-C / كسر الأمر وإلا سيتعين عليك انتظار الكائنات المعالجة للخروج من RestoreAlreadyInProgress الحالة قبل أن تتمكن من إعادة تشغيله.قد يستغرق الأمر بضع ساعات حتى تنتقل الولاية.ستظهر لك رسالة الخطأ هذه إذا كنت بحاجة إلى الانتظار: An error occurred (RestoreAlreadyInProgress) when calling the RestoreObject operation
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top