วิธีการเปลี่ยนชื่อถัง AWS S3


150

ท้ายที่สุดแล้วการโยกย้ายที่ยากลำบากเพียงแค่ตระหนักว่าหากต้องการแสดงเนื้อหาโดยใช้ CNAME (เช่น media.abc.com) ชื่อฝากข้อมูลต้องเริ่มต้นด้วย media.abc.com/S3/amazon.com เพื่อให้แน่ใจว่าทำงานได้อย่างสมบูรณ์

เพิ่งรู้ว่า S3 ไม่อนุญาตให้เปลี่ยนชื่อโดยตรงจากคอนโซล

มีวิธีใดบ้างในการแก้ไขปัญหานี้?

คำตอบ:


104

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


2
มีค่าใช้จ่ายใด ๆ สำหรับการแก้ปัญหาข้างต้น @navjot?
pavitran

@pavitran nope ยังคงเป็นทางไป
Tashows

8
@Tashows pavitran ถามเกี่ยวกับ chaRges ไม่ใช่ chaNges เท่าที่ฉันรู้มีค่าใช้จ่ายสำหรับการคัดลอกรายการฝากข้อมูลฉันเชื่อว่า 1 GET และ 1 PUT สำหรับค่าใช้จ่ายในการดำเนินการสำหรับแต่ละรายการ
guival

5
@Tashows จริงๆแล้วมีรายการสำหรับการดำเนินการคัดลอกบนตารางการกำหนดราคาสำหรับ S3จริง ๆ แล้วมันเป็นเพียงค่าใช้จ่ายเดียวกับการทำ PUT (ดังนั้นจึงไม่มีค่าใช้จ่ายเพิ่มเติม)
guival

3
โปรดทราบว่าคุณสามารถตัดและวางโดยใช้เว็บคอนโซลสำหรับผู้ที่ไม่ต้องการทำสิ่งนี้ผ่าน CLI
mahemoff

241

สารละลาย

aws s3 mb s3://[new-bucket]
aws s3 sync s3://[old-bucket] s3://[new-bucket]
aws s3 rb --force s3://[old-bucket]

คำอธิบาย

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

รหัสด้านบนจะ 1. สร้างที่เก็บข้อมูลใหม่ 2. คัดลอกไฟล์ทับและ 3 ลบที่เก็บข้อมูลเก่า แค่นั้นแหละ.

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

ตัวอย่าง

ในตัวอย่างต่อไปนี้เราสร้างและเติมที่ฝากข้อมูลเก่าแล้วซิงค์ไฟล์กับอันใหม่ ตรวจสอบผลลัพธ์ของคำสั่งเพื่อดูว่า AWS ทำอะไร

> # bucket suffix so we keep it unique
> suffix="ieXiy2"  # used `pwgen -1 -6` to get this
>
> # populate old bucket
> echo "asdf" > asdf.txt
> echo "yxcv" > yxcv.txt
> aws s3 mb s3://old-bucket-$suffix
make_bucket: old-bucket-ieXiy2
> aws s3 cp asdf.txt s3://old-bucket-$suffix/asdf.txt
upload: ./asdf.txt to s3://old-bucket-ieXiy2/asdf.txt
> aws s3 cp yxcv.txt s3://old-bucket-$suffix/yxcv.txt
upload: ./yxcv.txt to s3://old-bucket-ieXiy2/yxcv.txt
>
> # "rename" to new bucket
> aws s3 mb s3://new-bucket-$suffix
make_bucket: new-bucket-ieXiy2
> aws s3 sync s3://old-bucket-$suffix s3://new-bucket-$suffix
copy: s3://old-bucket-ieXiy2/yxcv.txt to s3://new-bucket-ieXiy2/yxcv.txt
copy: s3://old-bucket-ieXiy2/asdf.txt to s3://new-bucket-ieXiy2/asdf.txt
> aws s3 rb --force s3://old-bucket-$suffix
delete: s3://old-bucket-ieXiy2/asdf.txt
delete: s3://old-bucket-ieXiy2/yxcv.txt
remove_bucket: old-bucket-ieXiy2

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

2
พยายามใช้วิธีนี้ ... ดูเหมือนจะใช้งานได้ ... แต่ด้วยเหตุผลแปลก ๆ บางอย่างฉันไม่สามารถดูรายการใด ๆ (ภาพ) ฉันสามารถนำทางผ่านเบราว์เซอร์ผ่านรายการบนแผงควบคุม s3 ... แต่ไม่สามารถดูได้ผ่าน URL หรือดาวน์โหลด ความคิดใดทำไม การอนุญาตดูเหมือนจะเหมือนกัน มีการอนุญาตพิเศษให้ระวังหรือไม่?
bmiskie

1
@duality_ คุณสามารถเพิ่มการแจ้งเตือนคำตอบเกี่ยวกับการอนุญาตและคุณสามารถคัดลอกไฟล์ด้วย--acl bucket-owner-full-control(เช่นในคำตอบนั้น)
ЕвгенийМасленков

1
โปรดทราบว่าคุณต้องระบุภูมิภาคด้วยมิฉะนั้นที่เก็บข้อมูลใหม่ของคุณจะอยู่ใน US East (North Virginia) เช่น aws --region ap-southeast-2 s3 mb s3://new-bucket
cobberboy

1
หากคุณมีการกำหนดเวอร์ชันคุณจะต้องใช้การจัดการวงจรชีวิตเพื่อหมดอายุรุ่น ... เห็นได้ชัดว่า: docs.aws.amazon.com/AmazonS3/latest/dev/…
carlin.scott

38

อาจเป็นชุดเครื่องมือ AWS CLI รุ่นที่ใหม่กว่านั้นเป็นmvตัวเลือก

$ aws --version
aws-cli/1.15.30 Python/3.6.5 Darwin/17.6.0 botocore/1.10.30

ฉันเปลี่ยนชื่อถังโดยใช้คำสั่งต่อไปนี้:

aws s3 mv s3://old-bucket s3://new-bucket --recursive

9
สิ่งนี้ใช้ได้สำหรับฉัน อย่างไรก็ตามมันเป็นสิ่งสำคัญที่จะต้องทราบว่าnew-bucketจะต้องสร้างขึ้นก่อนที่จะใช้คำสั่ง นอกจากนี้old-bucketจะว่างเปล่า แต่ไม่ถูกลบ หากคุณต้องการที่จะลบมันหลังจากการถ่ายโอนไฟล์ทั้งหมดให้ใช้คำสั่งต่อไปนี้ (โดยไม่ต้องวงเล็บเหลี่ยม):aws s3api delete-bucket --bucket <old-bucket> --region <region id>
Mabyn

ถ้ามีการใช้ที่ฝากข้อมูลเก่าทุกที่มันเป็นวิธีที่ดีในการคัดลอกที่ฝากข้อมูลทดสอบกับปลายทางใหม่และหลังจากนั้นให้ลบที่เก็บข้อมูลเดิม aws s3 mvคัดลอกและลบจริง ๆ แล้วดังนั้นต้นทุนทางการเงินควรจะเหมือนกัน (ฉันคิดว่า)
Flimm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.