2017-09-13 47 views
0
的多個AWS S3對象

我試圖從AWS S3中刪除當前標記以恢復以前的版本。我有很多文件要刪除。但是當使用以下命令時,是或否提示被觸發。有什麼辦法可以避免這種提示嗎?刪除版本號爲

AWS s3api列表對象的版本--bucket MY_BUCKET --output JSON --query 'DeleteMarkers [] [重點,VERSIONID]' --region美國東部-1 | jq -r'。[] | 「--key'\''」+。[0] +「'\''--version-id」+。[1]'| xargs的-p -L1 AWS s3api刪除對象--bucket MY_BUCKET --region美國東1

下面是此腳本示例輸出。

aws s3api delete-object --bucket my_bucket --region us-east-1 --key 58a7ec1f77dd6e3ff3024a65/1487498355//39.jpeg --version-id _VY88LfKX3tXy2JABbC6rhDzKl3xhkg0 ?... 

這裏我們需要給出「y」作爲答案。然後會觸發下一個提示。問題是我有800,000個文件來做同樣的操作。

現在我正在使用以下命令。

回聲 '#!/斌/慶典'> undeleteScript.sh & & AWS --output文本s3api 列表對象的版本--bucket MY_BUCKET | grep -E「^ DELETEMARKERS」| awk'{FS =「[\ t] +」; print「aws s3api delete-object --bucket my_bucket --key \ 42」$ 3「\ 42 --version-id」$ 5「;」}'>> undeleteScript.sh & &。 undeleteScript.sh; rm -f undeleteScript.sh;

但是,這似乎很慢。任何其他命令,使這個簡單的&快?

+0

請問您可以在代碼標籤中輸入示例Input_file,也可以在代碼標籤中輸出預期輸出,因爲它根本不清楚。 – RavinderSingh13

+0

我已經添加了該命令的示例輸出。請檢查。 –

回答

0

我會看看使用bash之外的語言來執行大型循環操作。像JS或Go之類的東西。

var AWS = require('aws-sdk'); 
var s3 = new AWS.S3({apiVersion: '2006-03-01'}); 
var _ = require('underscore'); 

var params = { 
    Bucket: "exampleBucket", 
    Prefix: "exampleItem" 
}; 

var getObjectsToDelete = s3.listObjectVersions(params).promise() 

getObjectsToDelete.then(function(data) { 
    console.log(data) 
    return _.map(data.Versions, function(object){ 
     return _.pick(object, 'Key', 'VersionId') 
    }) 
}).then(function(data) { 
    var theDeleted = { 
     Bucket: params.Bucket, 
     Delete: { 
      Objects: data 
     } 
    } 
    s3.deleteObjects(theDeleted, function(err, data) { 
     if (err) console.log(err, err.stack); // an error occurred 
     else  console.log(data); 
    }) 
}) 

另一個選擇是爲存儲桶中的對象版本設置LifeCycle規則。一些爲NoncurrentVersionExpiration

https://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingObjectVersions.html

+0

如何實現這一點,如果我有幾百萬個文件要刪除。在這種情況下,不可能使用前綴值。 –

+0

你可以用一個迭代過程來包裝它,這個過程可以遍歷你桶中的所有項目 – mhumesf

0

我試圖在非高峯時間問題發佈第二個腳本。每小時恢復3 Gb數據。由於數據是從冰川恢復的,這是我獲得的最大速度。

我再次發佈腳本以供參考。

echo '#!/bin/bash' > undeleteScript.sh && aws --output text s3api list-object-versions --bucket my_bucket | grep -E "^DELETEMARKERS" | grep -E "2017-09-11" | awk '{FS = "[\t]+"; print "aws s3api delete-object --bucket my_bucket --key \42"$3"\42 --version-id "$5";"}' >> undeleteScript.sh && . undeleteScript.sh; rm -f undeleteScript.sh; 

其中,

MY_BUCKET = S3存儲桶名稱

2017年9月11日=文件刪除日期(此標記將被刪除,以前的最新版本將恢復)。