【问题标题】:Cannot delete item from a versioned s3 bucket无法从版本化的 s3 存储桶中删除项目
【发布时间】:2021-04-12 02:01:37
【问题描述】:

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

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'
}

【问题讨论】:

    标签: python-3.x amazon-web-services amazon-s3


    【解决方案1】:

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

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

    在响应中。

    Amazon S3 中的删除标记是一个占位符(或标记) 在简单的 DELETE 请求中命名的版本化对象。因为 该对象在启用版本控制的存储桶中,该对象不是 删除。但是删除标记使 Amazon S3 的行为就像是 已删除。

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

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

    More on removing the delete marker

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

    警告!这将有效地清除您的存储桶!

    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.")
    

    【讨论】:

      【解决方案2】:

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

      object_versions

      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'
      )
      

      这里还有一个很好的例子Delete all versions of an object in S3 using python?

      【讨论】:

        猜你喜欢
        • 2017-11-16
        • 2017-06-08
        • 2014-11-03
        • 2015-06-30
        • 2020-07-03
        • 1970-01-01
        • 2018-05-16
        • 2012-05-16
        • 1970-01-01
        相关资源
        最近更新 更多