javascript - 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)
它可以在没有任何版本控制支持的情况下工作(文件已删除)。
解决方案
推荐阅读
- android - 从 ViewModel 的 onCleared 中取消所有待处理的 Kotlin 作业
- mysql - 创建表时 MySQL Workbench 错误 1064
- python - 具有 3 列原始数据的数据帧的相对频率?
- javascript - 在 XD 插件中与远程服务器通信
- oracle - 如何在我的程序中使用乐观锁定?
- javascript - 在浏览器中显示 html 而不是文本框
- oracle-apex - ORA-04098: 触发器 'PRAS.B' 无效并且重新验证失败
- docker-compose - 我可以停止 Azure Container Service for Linux 发出 Docker Pull 命令吗?
- git - 如何将 git rev-list 限制为特定分支和远程?
- mongodb - 通过 AWS lambda 执行时,mongo 数组更新失败