首页 > 解决方案 > S3 使用 DeleteMarker 删除版本化对象

问题描述

在第一次删除操作后,我必须删除具有 DeleteMarker 的 S3 版本化对象:

{ DeleteMarker: true, VersionId: 'TxxQ.AtCmKflgRz6xTeBVYdOeTTLKUt' }

出于这个原因,正如这里的文档中所建议的那样

我尝试删除指定删除标记版本 id 的对象,但随后我得到另一个响应,如上:

{ DeleteMarker: true, VersionId: 'TxxQ.AtCmKflgRz6xTeBVYdOeTTLKUt' }

整个代码如下:

        var s3 = self.s3Store.GetInstance();
        var params = { 
            Bucket: options.Bucket,
            Key: documentKey 
        };
        if (self.logger) self.logger.info("S3Dataset delete bucket:%s key:%s", options.Bucket, documentKey);
        s3.deleteObject(params, function (error, data) {
            if (error) {
                if (self.logger) self.logger.error("S3Dataset delete error key:%s error:%@", documentKey, error);
                return callback(error);
            }
            else if (!Util.empty(data) &&
                !Util.empty(data) &&
                data.DeleteMarker &&
                !Util.empty(data.VersionId)) { // object version to delete

                var VersionId = data.VersionId;
                // The bucket is versioned - https://docs.aws.amazon.com/AmazonS3/latest/dev/DeleteMarker.html
                // { "DeleteMarker": true, "VersionId": "azW0.aiZyTSQzjwFe0YkIkGyL.JXJK8y" }
                if (self.logger) self.logger.info("S3Dataset delete key:%s version:%@", documentKey, VersionId);

                var params = { 
                    Bucket: options.Bucket,
                    Key: documentKey,
                    VersionId: VersionId
                };
                s3.deleteObject(params, function (error, data) {
                    if (error) {
                        if (self.logger) self.logger.error("S3Dataset delete error key:%s error:%@", documentKey, error);
                        return callback(error);
                    } else {
                        return callback(null,data);
                    }
                });
            }
            else {
                var error = new Error('delete error');
                if (self.logger) self.logger.error("S3Dataset delete error key:%s error:%@", documentKey, error);
                return callback(error);
            }

结果是另一个响应VersionId

{
   "DeleteMarker": true,
   "VersionId": "TxxQ.AtCmKflgRz6xTeBVYdOeTTLKUt"
}

所以看起来实际的删除并没有发生,尽管VersionID对该对象使用了删除。

如果我在Python

import boto3

BUCKET = 'my_buckt'
key = 'my_bucket_key'
s3 = boto3.client('s3')
s3.delete_object(Bucket=BUCKET, Key=key)

它可以在没有任何版本控制支持的情况下工作(文件已删除)。

标签: javascriptamazon-s3aws-sdk-js

解决方案


推荐阅读