【问题标题】:Delete multiple AWS S3 objects with version id删除多个具有版本 ID 的 AWS S3 对象
【发布时间】:2018-02-22 07:58:45
【问题描述】:

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

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 删除对象 --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 --output text s3api 列表对象版本 --bucket my_bucket | grep -E "^DELETEMARKERS" | awk '{FS = "[\t]+";打印“aws s3api 删除对象--bucket my_bucket --key \42"$3"\42 --version-id "$5";"}' >> undeleteScript.sh && . undeleteScript.sh; rm -f undeleteScript.sh;

但是,这似乎很慢。还有其他命令可以让这变得简单快捷吗?

【问题讨论】:

  • 能否请您在代码标签中发布示例 Input_file 并在代码标签中发布预期输出,因为它根本不清楚。
  • 我添加了命令的示例输出。请检查。

标签: amazon-web-services amazon-s3


【解决方案1】:

我会考虑使用 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);
    })
})

另一种选择是为存储桶中的对象版本设置生命周期规则。 NoncurrentVersionExpiration 的东西。

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

【讨论】:

  • 如果我有数百万个文件要删除,如何实现。在这种情况下,前缀值是不可能的。
  • 您可以用一个迭代过程来包装它,该过程将遍历您存储桶中的所有项目
【解决方案2】:

我在非高峰时间尝试了第二个有问题的脚本。每小时恢复 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 = 文件删除日期(此标记将被删除并恢复之前的最新版本)。

【讨论】:

  • 我正在寻找一个 aws cli 命令,该命令将显示每个 s3 存储桶对象有多少个不同的版本,即计算一个文件有多少个版本 ID
猜你喜欢
  • 1970-01-01
  • 2020-10-24
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2018-10-18
  • 2018-03-30
相关资源
最近更新 更多