2017-09-13 51 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日=文件删除日期(此标记将被删除,以前的最新版本将恢复)。