删除具有版本ID的多个AWS S3对象

时间:2017-09-13 14:37:41

标签: amazon-web-services amazon-s3

我正在尝试从AWS S3中删除当前标记,以便恢复以前的版本。我有很多要删除的文件。但是在使用以下命令时,会触发是或否触发提示。有没有办法避免这个提示?

  

aws s3api list-object-versions --bucket my_bucket --output json   --query'DeleteMarkers []。[Key,VersionId]' - region us-east-1 | jq -r'。[] | “--key'\''”+。[0] +“'\'' - version-id”+。[1]'| xargs -p   -L1 aws s3api delete-object --bucket my_bucket --region us-east-1

以下是此脚本的示例输出。

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

这里我们需要给出“y”作为答案。然后将触发下一个提示。问题是我有800,000个文件来执行相同的操作。

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

  

echo'#!/ bin / bash'> undeleteScript.sh&& aws - 输出文本s3api   list-object-versions --bucket my_bucket | grep -E“^ DELETEMARKERS”|   awk'{FS =“[\ t] +”;打印“aws s3api delete-object --bucket my_bucket   --key \ 42“$ 3”\ 42 --version-id“$ 5”;“}'>> undeleteScript.sh&& .undeteteScript.sh; rm -f undeleteScript.sh;

但是,这似乎很慢。任何其他命令,使这个简单&快?

2 个答案:

答案 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

答案 1 :(得分: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-09-11 =文件已删除日期(此标记将被删除,之前的最新版本将被恢复)。