AWS รองรับการลบวัตถุได้สูงสุด 1,000 รายการต่อคำขอโดยใช้ S3 REST API และโปรแกรมเสริมต่างๆ เมธอดนี้ถือว่าคุณรู้ว่าคีย์อ็อบเจ็กต์ S3 ที่คุณต้องการลบ (นั่นคือมันไม่ได้ออกแบบมาเพื่อจัดการบางอย่างเช่นนโยบายการเก็บข้อมูลไฟล์ที่มีขนาดเกินขนาดที่กำหนด ฯลฯ )
S3 REST API สามารถระบุไฟล์สูงสุด 1000 ไฟล์ที่จะลบในคำขอเดียวซึ่งจะต้องเร็วกว่าการร้องขอแต่ละรายการ โปรดจำไว้ว่าคำขอแต่ละรายการเป็นคำขอ HTTP (เช่น TCP) ดังนั้นแต่ละคำขอมีค่าใช้จ่าย คุณเพียงแค่ต้องรู้กุญแจของวัตถุและสร้างคำขอ HTTP (หรือใช้กระดาษห่อในภาษาที่คุณต้องการ) AWS ให้ข้อมูลที่ดีเกี่ยวกับคุณลักษณะนี้และการใช้งานของ เพียงเลือกวิธีที่คุณพอใจที่สุด!
ฉันสมมติว่ากรณีการใช้งานของคุณเกี่ยวข้องกับผู้ใช้ปลายทางที่ระบุจำนวนไฟล์ที่จะลบในครั้งเดียว แทนที่จะเริ่มงานเช่น "ล้างวัตถุทั้งหมดที่อ้างถึงไฟล์รูปภาพ" หรือ "ล้างไฟล์ทั้งหมดที่เก่ากว่าวันที่กำหนด" (ซึ่งฉันเชื่อว่าง่ายต่อการกำหนดค่าแยกต่างหากใน S3)
ถ้าเป็นเช่นนั้นคุณจะรู้ถึงกุญแจที่คุณต้องลบ นอกจากนี้ยังหมายถึงผู้ใช้จะชอบข้อเสนอแนะเรียลไทม์เกี่ยวกับว่าไฟล์ของพวกเขาถูกลบประสบความสำเร็จหรือไม่ การอ้างอิงถึงคีย์ที่ถูกต้องน่าจะเร็วมากเนื่องจาก S3 ได้รับการออกแบบให้ปรับขนาดได้อย่างมีประสิทธิภาพแม้จะจัดการกับข้อมูลจำนวนมาก
ถ้าไม่คุณสามารถดูการเรียก API แบบอะซิงโครนัส คุณสามารถอ่านเล็กน้อยเกี่ยวกับวิธีการทำงานโดยทั่วไปจากโพสต์บล็อกนี้หรือค้นหาวิธีการใช้งานในภาษาที่คุณเลือก สิ่งนี้จะทำให้การร้องขอการลบใช้เธรดของตนเองและโค้ดที่เหลือสามารถดำเนินการได้โดยไม่ต้องรอให้ผู้ใช้รอ หรือคุณสามารถลดการร้องขอไปยังคิว . . แต่ตัวเลือกทั้งสองนี้ไม่จำเป็นต้องซับซ้อนทั้งรหัสของคุณ (รหัสแบบอะซิงโครนัสอาจสร้างความรำคาญ) หรือสภาพแวดล้อมของคุณ (คุณต้องมีบริการ / daemon / container / server เพื่อจัดการคิวดังนั้นฉันจะหลีกเลี่ยงสถานการณ์นี้ถ้าเป็นไปได้
แก้ไข: ฉันไม่มีชื่อเสียงในการโพสต์ลิงก์มากกว่า 2 ลิงก์ แต่คุณสามารถเห็นความคิดเห็นของ Amazon เกี่ยวกับอัตราการร้องขอและประสิทธิภาพได้ที่นี่: http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-per-perf-considerations.html http://docs.aws.amazon.com/3/latest/dev/request-rate-perf-considerations.htmlและความคิดเห็น s3 faq ที่ deleiton จำนวนมากคือ ทางไปถ้าเป็นไปได้
aws s3api list-objects --output text --bucket BUCKET --query 'Contents[].[Key]' | pv -l > BUCKET.keys
แล้วจึงลบวัตถุ (ซึ่งเพียงพอที่จะดำเนินการมากกว่า 1 กระบวนการแบบขนานถึงขีด จำกัด อัตราสำหรับการลบวัตถุ):tail -n+0 BUCKET.keys | pv -l | grep -v -e "'" | tr '\n' '\0' | xargs -0 -P1 -n1000 bash -c 'aws s3api delete-objects --bucket BUCKET --delete "Objects=[$(printf "{Key=%q}," "$@")],Quiet=true"' _