ตั้งค่าการควบคุมแคชสำหรับที่เก็บข้อมูล S3 ทั้งหมดโดยอัตโนมัติ (ใช้นโยบายที่เก็บข้อมูล?)


126

ฉันต้องการตั้งค่าส่วนหัวการควบคุมแคชสำหรับที่เก็บข้อมูล s3 ทั้งหมดทั้งไฟล์ที่มีอยู่และไฟล์ในอนาคตและหวังว่าจะทำในนโยบายที่เก็บข้อมูล ฉันรู้ว่าฉันสามารถแก้ไขไฟล์ที่มีอยู่ได้และฉันรู้วิธีระบุมันหากฉันอัปโหลดด้วยตัวเอง แต่น่าเสียดายที่แอพที่อัปโหลดไม่สามารถตั้งค่าส่วนหัวได้เนื่องจากใช้ s3fs เพื่อคัดลอกไฟล์ที่นั่น

คำตอบ:


209

ขณะนี้มี 3 วิธีที่จะได้รับนี้ทำ: ผ่านคอนโซล AWS , ผ่านบรรทัดคำสั่งหรือผ่านทางเครื่องมือบรรทัดคำสั่ง s3cmd


คำแนะนำคอนโซล AWS

นี่เป็นวิธีแก้ปัญหาที่แนะนำ ตรงไปตรงมา แต่อาจต้องใช้เวลาสักระยะ

  • เข้าสู่ระบบ AWS Management Console
  • ไปที่ถัง S3
  • เลือกไฟล์ทั้งหมดตามเส้นทาง
  • เลือก "เพิ่มเติม" จากเมนู
  • เลือก "เปลี่ยนข้อมูลเมตา"
  • ในฟิลด์ "คีย์" เลือก "การควบคุมแคช" จากเมนูแบบเลื่อนลง max-age = 604800 ป้อน (7 วัน) สำหรับค่า
  • กดปุ่ม "บันทึก"

( ขอบคุณ @biplob - โปรดมอบความรักให้เขาด้านล่าง )


โซลูชัน AWS Command Line

เดิมทีเมื่อฉันสร้างนโยบายที่เก็บข้อมูลนี้ไม่ต้องไปเลยฉันจึงคิดว่าจะทำอย่างไรโดยใช้ aws-cli และมันก็ค่อนข้างเนียน เมื่อค้นคว้าฉันไม่พบตัวอย่างใด ๆ ในป่าดังนั้นฉันจึงคิดว่าจะโพสต์วิธีแก้ปัญหาบางอย่างเพื่อช่วยเหลือผู้ที่ต้องการความช่วยเหลือ

หมายเหตุ: ตามค่าเริ่มต้น aws-cli จะคัดลอกเฉพาะข้อมูลเมตาปัจจุบันของไฟล์แม้ว่าคุณจะระบุข้อมูลเมตาใหม่ก็ตาม

ในการใช้ข้อมูลเมตาที่ระบุในบรรทัดคำสั่งคุณต้องเพิ่มแฟล็ก '--metadata-directive REPLACE' นี่คือตัวอย่างบางส่วน

สำหรับไฟล์เดียว

aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

สำหรับที่เก็บข้อมูลทั้งหมด (หมายเหตุ - ค่าสถานะย้อนกลับ):

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

ฉันพบ gotcha เล็กน้อยหากคุณต้องการใช้กับไฟล์ประเภทใดประเภทหนึ่งเท่านั้นคุณต้องยกเว้นไฟล์ทั้งหมดจากนั้นรวมไฟล์ที่คุณต้องการ

เฉพาะ jpgs และ pngs:

aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public

ลิงค์ไปยังคู่มือนี้หากคุณต้องการข้อมูลเพิ่มเติม:

ปัญหาที่ทราบ:

"Unknown options: --metadata-directive, REPLACE"

สิ่งนี้อาจเกิดจาก awscli ล้าสมัย - ดูคำตอบของ @ eliotRosewater ด้านล่าง


เครื่องมือ S3cmd

S3cmd เป็น "เครื่องมือบรรทัดคำสั่งสำหรับจัดการบริการ Amazon S3 และ CloudFront" แม้ว่าโซลูชันนี้ต้องใช้การดึงคอมไพล์ แต่ก็อาจเป็นโซลูชันที่ง่ายและครอบคลุมมากกว่า

ดูคำแนะนำแบบเต็มได้ที่โพสต์ของ @ ashishyadaveee11 ด้านล่าง


หวังว่าจะช่วยได้!


6
ขอบคุณสำหรับตัวอย่างจริงของสิ่งที่ต้องทำ ฉันประสบปัญหาในการค้นหาสิ่งที่เป็นไปได้เพียงแค่อ่านเอกสาร
danneu

2
ฉันได้รับ "Unknown options: --metadata-directive, REPLACE" เมื่อฉันเรียกใช้คำสั่งใด ๆ ข้างต้นโปรดช่วยฉันด้วย
user3722785

1
โปรดทราบว่าตอนนี้เป็นวิธีที่ง่ายกว่า ตอนนี้คุณสามารถเปลี่ยนข้อมูลเมตาสำหรับไฟล์ทั้งหมดในที่เก็บข้อมูลผ่าน AWS Console ดูคำตอบของ CoderBoy ด้านล่าง: stackoverflow.com/a/47072736/2538952
Martin Tschammer

1
โปรดทราบว่าการใช้ --meta-directive REPLACE จะเขียนทับข้อมูลเมตาก่อนหน้าใด ๆ ที่ไม่ได้คัดลอกในคำสั่ง! ตัวอย่างเช่น "gzip การเข้ารหัสเนื้อหา" จะถูกลบออกเมื่อไม่ได้เพิ่มลงในคำสั่ง cp อย่างชัดเจน
Harmen Janssen

1
ไม่cpดาวน์โหลดและอัปโหลดใหม่ทุกอย่าง?
mlissner

38

ตอนนี้สามารถเปลี่ยนได้อย่างง่ายดายจากคอนโซล AWS

  • เข้าสู่ระบบ AWS Management Console
  • ไปที่ถัง S3
  • เลือกไฟล์ทั้งหมดตามเส้นทาง
  • เลือก "เพิ่มเติม" จากเมนู
  • เลือก "เปลี่ยนข้อมูลเมตา"
  • ในช่อง "คีย์" ให้เลือก "การควบคุมแคช" จากเมนูแบบเลื่อนลง
  • max-age = 604800 ป้อน (7 วัน) สำหรับ Value
  • กดปุ่ม "บันทึก"

ต้องใช้เวลาในการดำเนินการขึ้นอยู่กับไฟล์ที่เก็บข้อมูลของคุณ ทำซ้ำตั้งแต่ต้นหากคุณปิดเบราว์เซอร์โดยไม่ได้ตั้งใจ


6
"เลือกไฟล์ทั้งหมดตามเส้นทาง" หมายความว่าอย่างไร
Tamzin Blake

1
เลือกไฟล์ทั้งหมด / บางไฟล์จากไดเร็กทอรีที่คุณต้องการตั้งค่า meta
biplob

ขออภัยสำหรับการตอบกลับล่าช้า. ไม่มันไม่ได้ คุณควรตั้งค่าจากแอปพลิเคชันของคุณ
biplob

สิ่งนี้แทนที่ข้อมูลเมตาก่อนหน้านี้หรือเพิ่มเข้าไป (ฉันไม่อยากเสียเนื้อหาทุกประเภท!)
คริส

ฉันยืนยันว่ามันไม่ได้ลบค่าที่มีอยู่ ตั้งค่าคีย์ที่คุณระบุเท่านั้น (เขียนทับคีย์ถ้ามี)
rynop

21

ขั้นตอน

  1. git clone https://github.com/s3tools/s3cmd
  2. เรียกใช้s3cmd --configure (คุณจะถูกถามถึงสองคีย์ - คัดลอกและวางจากอีเมลยืนยันของคุณหรือจากหน้าบัญชี Amazon ของคุณโปรดใช้ความระมัดระวังในการคัดลอกคีย์เหล่านี้เป็นกรณีที่สำคัญและต้องป้อนให้ถูกต้องไม่เช่นนั้นคุณจะได้รับข้อผิดพลาดเกี่ยวกับไม่ถูกต้อง ลายเซ็นหรือสิ่งที่คล้ายกันอย่าลืมเพิ่มs3:ListAllMyBucketsสิทธิ์ให้กับคีย์มิฉะนั้นคุณจะได้รับAccessDeniedข้อผิดพลาดขณะทดสอบการเข้าถึง)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/

คำตอบสุดยอด ขอบคุณ! มีวิธีอัปเดตเฉพาะที่ยังไม่มีการตั้งค่าส่วนหัวนี้หรือไม่?
PKHunter

ใครมีวิธีแก้คล้าย ๆ กันสำหรับใช้กับ S3Express ของ window บ้าง?
โจ

12

ถ้าคะแนนชื่อเสียงของฉัน> 50 ฉันก็แค่แสดงความคิดเห็น แต่ยังไม่ (ยัง) ดังนั้นนี่คือคำตอบที่สมบูรณ์อีกข้อหนึ่ง


ฉันต่อสู้กับปัญหานี้มาระยะหนึ่งแล้ว จนกระทั่งฉันพบและอ่านเอกสาร แบ่งปันที่นี่เผื่อว่าจะช่วยคนอื่นได้:

สิ่งที่ทำงานได้อย่างน่าเชื่อถือสำหรับฉันคือคำสั่งนี้ ฉันเลือกเวลาหมดอายุ 1 วินาทีสำหรับการทดสอบเพื่อยืนยันผลลัพธ์ที่คาดหวัง:

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACEจำเป็นเมื่อ " cp" แก้ไขข้อมูลเมตาในไฟล์ที่มีอยู่ใน S3
  • max-age กำหนดอายุการแคชของเบราว์เซอร์เป็นวินาที
  • s-maxage ตั้งค่าการแคช CloudFront เป็นวินาที

ในทำนองเดียวกันหากตั้งค่าส่วนหัว Cache-Control เหล่านี้ในไฟล์ขณะอัปโหลดไปยัง S3 คำสั่งจะมีลักษณะดังนี้:

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /local/path/file \
  s3://bucket/path/file

8

ฉันไม่คิดว่าคุณจะระบุสิ่งนี้ได้ที่ระดับที่เก็บข้อมูล แต่มีวิธีแก้ปัญหาเล็กน้อยสำหรับคุณ

  1. คัดลอกออบเจ็กต์เป็นของตัวเองบน S3 การตั้งค่าcache-controlส่วนหัวที่เหมาะสมสำหรับการดำเนินการคัดลอก

  2. ระบุส่วนหัวของการตอบสนองใน url ไปยังไฟล์ คุณจำเป็นต้องใช้ URL ที่ก่อนลงนามสำหรับการทำงาน แต่คุณสามารถระบุส่วนหัวของการตอบสนองบางอย่างในสตริงการสืบค้นรวมและcache-control expiresสำหรับรายการตัวเลือกทั้งหมดโปรดดู: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225


ขอบคุณ Geoff ฉันรู้เกี่ยวกับ (1) แต่ไม่ใช่ (2) ไม่ใช่สิ่งที่ฉันหวังไว้ (แม้ว่าฉันจะกลัวว่าจะเป็นไปไม่ได้
ก็ตาม

คุณมีตัวอย่างคำสั่ง AWS CLI เกี่ยวกับวิธีทำ # 1 หรือไม่? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm

3

คุณสามารถกำหนดค่าแลมด้าด้วยทริกเกอร์บน PUTOBJECT บน S3 แลมบ์ดาจะเปลี่ยนส่วนหัวของวัตถุเฉพาะที่เพิ่งใส่ไป

จากนั้นคุณสามารถเรียกใช้คำสั่งคัดลอกที่กล่าวถึงข้างต้นเป็นครั้งสุดท้ายและแลมบ์ดาอ็อบเจ็กต์ใหม่ทั้งหมดจะได้รับการแก้ไข

UPDATE:

นี่คือจุดเริ่มต้นที่ดี: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /


คุณช่วยให้รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำ lamba นี้ได้หรือไม่? ดูเหมือนเป็นทางออกที่ดี
Wouter

1
@ เราเตอร์แน่ใจว่าฉันพบลิงก์ที่สามารถช่วยให้คุณไปที่นั่นได้อย่างง่ายดายaaronfagan.ca/blog/2017/…หากคุณต้องการความช่วยเหลือหรือการสนับสนุนฉันยินดีเป็นอย่างยิ่งที่จะช่วย
Ibrahim Bou Ncoula

ฉันรู้ว่ามันเก่า แต่ฉันพบว่าแหล่งข้อมูลนี้มีประโยชน์สำหรับสิ่งที่ฉันกำลังมองหา ขอบคุณสำหรับสิ่งนี้. upvotes ให้คุณเพื่อนของฉัน!
castaway2000

1

สำหรับผู้ที่พยายามใช้คำตอบของ Dan และได้รับข้อผิดพลาด:

"ตัวเลือกที่ไม่รู้จัก: - metadata-directive, REPLACE"

ฉันพบปัญหาและปัญหาคือฉันติดตั้ง awscli โดยใช้ไฟล์

sudo apt-get ติดตั้ง awscli

สิ่งนี้ได้ติดตั้ง awscli เวอร์ชันเก่าซึ่งไม่มีคำสั่ง --metadata-directive ดังนั้นฉันจึงใช้ sudo apt-get remove awscli เพื่อลบออก

จากนั้นติดตั้งใหม่ตามขั้นตอนจาก amazon: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

ข้อแตกต่างเพียงอย่างเดียวคือฉันต้องใช้ sudo -H เนื่องจากปัญหาการอนุญาตซึ่งคนอื่นอาจพบด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.