我正在尝试从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;
但是,这似乎很慢。任何其他命令,使这个简单&快?
答案 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 =文件已删除日期(此标记将被删除,之前的最新版本将被恢复)。