[英]aws cli copy between S3 regions on EC2
我正在嘗試使用 EC2 服務器上的命令行界面在不同區域的兩個 S3 存儲桶之間進行復制。
地區信息:
EC2 實例:us-west-2
S3 來源:us-east-1
S3 目的地:us-west-2
以下命令可在 EC2 服務器上完美運行:
aws s3 cp s3://n-virginia/origin s3://n-virginia/destination --recursive --source-region us-east-1 --region us-east-1 --profile my_profile
aws s3 cp s3://oregon/origin s3://oregon/destination --recursive --source-region us-west-2 --region us-west-2 --profile my_profile
我需要從 EC2 服務器運行以下命令:
aws s3 cp s3://n-virginia/origin s3://oregon/destination --recursive --source-region us-east-1 --region us-west-2 --profile my_profile
如果我從本地計算機運行該命令,它可以工作,但如果我從用於前兩個命令的 EC2 服務器運行它,我會收到以下錯誤:
錯誤: "A client error (AccessDenied) occurred when calling the CopyObject operation: VPC endpoints do not support cross-region requests"
我能夠將文件從源存儲桶復制到 EC2 服務器,然后從 EC2 服務器復制到目標存儲桶,但這不是生產中可接受的解決方案。 我不明白為什么它可以在本地機器上工作,但不能在 EC2 服務器上工作(“my_profile”在兩台機器上都是相同的)
正如評論中指出的,問題是您的 VPC 有一個端點,並且不支持跨區域副本。
要解決此問題,請通過更新您的 VPC 路由表暫時禁用 VPC 終端節點,或者只是創建一個沒有 VPC 終端節點的新 VPC 並在那里啟動 EC2。
跨區域復制將是理想的,但正如所指出的,這只會影響存儲桶中的新項目
您可能想使用aws s3 sync
而不是使用aws s3 cp
。 同步只會復制更改過的文件,因此您可以在它被中斷的情況下再次重新運行它。 例如:
aws s3 sync s3://n-virginia/origin s3://oregon/destination
還要注意的是兩個cp
和sync
不保留ACL。 因此,如果您更改了單個文件的 ACL 權限,它們將在復制后全部設置為默認值。 還有一些其他工具應該可以保留 ACL,例如https://s3tools.org ,這似乎對我有用。
如果由於需要磁盤空間而無法在本地下載整個存儲桶,您可以下載、上傳和刪除 5 秒的文件。
下面的 shell 片段的第一行開始將整個源存儲桶后台下載到本地磁盤。 當當前目錄中有文件時,調用aws s3 mv
將文件復制到目標存儲桶並在本地刪除它們。
mkdir tempdir
aws s3 sync s3://source-bucket . &
sleep 5
while [ $(ls | wc -l) -gt 0 ] ; do mv *.txt tempdir ; aws s3 mv --recursive tempdir/* s3://destination-bucket ; done
aws s3 sync 命令在將文件寫入磁盤時創建具有隨機擴展名的臨時文件。 不幸的是,aws s3 mv 命令有時會上傳這些文件。 為避免這種情況,請將一批文件(例如所有 .txt 文件)移動到臨時目錄並僅上傳它們。
在實踐中,我看到本地使用的磁盤不超過 50M(少於 500 個文件,其中每個文件小於 100k)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.