无法从版本为s3的存储桶中删除项目



我正试图从s3存储桶中删除一个特定的.jpg文件。我已经尝试了许多不同的方法,例如delete_object和其他几个堆栈溢出答案。它们都没有正常工作,导致程序每次都以不同的退出代码崩溃。下面的代码不会使程序崩溃,但是bucket保持不变。有人知道怎么解决这个问题吗?

s3 = boto3.resource('s3')
s3.Object('my-bucket', 'label_file').delete()

打印呼叫响应时,这是打印到终端的消息。


{
'ResponseMetadata': {
'RequestId': 'FJEOSIJFIO2J31',
'HostId': 'VEt+tpQ+DSAW5UTx/+kGgmE0JX43345lX2ULHMDSDrKye1PsTA3Eo=',
'HTTPStatusCode': 314,
'HTTPHeaders': {
'x-amz-id-2': 'VEt+tpQo2DAS6z+m8o3215UTx/+kGgmE0JX2DSi3ULHMDrKyevPsTA3Eo=',
'x-amz-request-id': 'T255WdZ732sVDWJF',
'date': 'Wed, 07 Apr 2021 19:28:04 GMT',
'x-amz-version-id': '4gi8EtDS27ZNy221tkziO',
'x-amz-delete-marker': 'true',
'server': 'AmazonS3'
},
'RetryAttempts': 0
},
'DeleteMarker': True,
'VersionId': '4gioU7FD36t5hcX21IOtkziO'
}

您的S3存储桶已启用版本控制,因为您有:

'x-amz-delete-marker': 'true',
...
'DeleteMarker': True,

在回应中。

AmazonS3中的删除标记是在简单DELETE请求中命名的受版本控制的对象。因为对象位于启用版本控制的bucket中,而对象不在已删除。但是删除标记使AmazonS3表现得好像已删除。

所以,基本上,你必须删除标记,然后删除文件。

如果要删除删除标记,它必须具有版本ID,并且必须在DELETE Object versionId请求中指定该ID。如果你使用DELETE请求删除删除标记(不指定删除标记的版本ID(,Amazon S3不删除删除标记,而是插入另一个删除标记。

有关删除标记的更多信息

要删除删除标记和版本化的文件,您可以使用以下代码:

警告!这将有效地清除你的水桶

def remove_versions(target_bucket: str) -> None:
s3 = boto3.resource("s3", region_name="your_s3_bucket_region_goes_here")
bucket = s3.Bucket(target_bucket)
object_version_iterator = bucket.object_versions.all()
for object_version in object_version_iterator:
key = object_version.object_key
object_id = object_version.id
print(f"Deleting key: {key} with id: {object_id}")
object_version.delete()
print(f"Done. {target_bucket} has been purged.")

您也可以删除单个对象版本。

对象版本

import boto3
bucket_name = "mybucket"
objects_to_delete = ['label_file', 'label_file1']
bucket = boto3.resource('s3').Bucket(bucket_name)
versions = bucket.object_versions.all()
# if you wanna delete all of them removing the check will be enough
for version in versions:
if version.object_key in objects_to_delete:
version.delete()

如果你愿意,你也可以使用filter创建一个删除过滤器

object_summary_iterator = bucket.objects.filter(
Delimiter='string',
EncodingType='url',
Marker='string',
MaxKeys=123,
Prefix='string',
RequestPayer='requester',
ExpectedBucketOwner='string'
)

这里还有另一个很好的例子,使用python删除S3中对象的所有版本?

最新更新