【问题标题】:Cannot delete a file from s3 with boto3无法使用 boto3 从 s3 中删除文件
【发布时间】:2020-02-13 12:15:38
【问题描述】:

我正在尝试使用 boto3 从 S3 中永久删除一个文件。我的存储桶没有使用版本控制。

我尝试了两种方法:

def remove_aws_object(bucket_name, item_key):
    ''' Provide bucket name and item key, remove from S3
    '''
    s3_client = boto3.client('s3',
                             aws_access_key_id=AWS_ACCESS_KEY,
                             aws_secret_access_key=AWS_SECRET)
    delete = s3_client.delete_object(Bucket=bucket_name, Key=item_key)
    print(delete)
{'ResponseMetadata': {'RequestId': '61F3C195D373B0C5', 'HostId': 'pigcx1wtIN+Y8RU3zJKliWXcXrHXHzpdAOuGBL64x3V9YefQbWXPZi9B/9F', 'HTTPStatusCode': 204, 'HTTPHeaders': {'x-amz-id-2': 'pigcx1wtIN+Y8RU3zJKliWXcXrHXHzpdAOuGBL64x3V9YefQbWXPZi9B/9FLazUSsCds8f4=', 'x-amz-request-id': '61F3C195D373B0C5', 'date': 'Thu, 13 Feb 2020 09:07:50 GMT', 'server': 'AmazonS3'}, 'RetryAttempts': 0}}

以及通过对象:

def remove_aws_object(bucket_name, item_key):
    ''' Provide bucket name and item key, remove from S3
    '''
    s3_client = boto3.resource('s3',
                             aws_access_key_id=AWS_ACCESS_KEY,
                             aws_secret_access_key=AWS_SECRET)

    my_object = s3_client.Object(bucket_name, item_key)
    a = my_object.delete()
    print(a)
    {'ResponseMetadata': {'RequestId': '6074B9CA870773CE', 'HostId': 'rQoK+x+xcjAw2T3DpTHMWQb4Gq6DzPJy2qFoFHQCYoGwb8/p7700+Nk+6gBIERN', 'HTTPStatusCode': 204, 'HTTPHeaders': {'x-amz-id-2': 'rQoK+x+xcjAw2TKK833DpTHMWQb4Gq6DzPJy2qFoFHQCYoGwb8/p7700+Nk+6gBIE', 'x-amz-request-id': '6074B9CA870773CE', 'date': 'Thu, 13 Feb 2020 12:02:36 GMT', 'x-amz-version-id': 'null', 'x-amz-delete-marker': 'true', 'server': 'AmazonS3'}, 'RetryAttempts': 0}, 'DeleteMarker': True, 'VersionId': 'null'}

这两种方法都可以正常工作,但不要删除文件,我仍然可以在 S3 控制台中看到它,然后我必须手动删除它。我做错了吗?

【问题讨论】:

  • 这仅适用于一个特定文件,还是适用于您尝试的任何文件?存储桶之前是否激活了版本控制? (DeleteMarker 在响应中的出现让我考虑到这一点。)您是否在不同的存储桶上尝试过此代码以查看它是否有效? (最好是一个新的桶。)
  • 尝试使用全新的存储桶,结果相同。即使在 14-16 小时后,我删除的对象仍然显示在我的存储桶中。
  • 我能想到的唯一可能是您的应用程序使用的凭据没有删除对象的权限。尝试在 AWS CLI 中使用这些相同的凭证来删除对象并查看它是否提供更具描述性的错误消息。

标签: amazon-s3 boto3


【解决方案1】:

为了重现您的情况,我做了以下操作:

  • 在 Amazon S3 管理控制台中创建了一个新存储桶
  • 通过管理控制台将文件上传到存储桶
  • 使用您的代码(第一个示例)删除对象

对象已成功删除。

所以,代码没问题。

【讨论】:

    【解决方案2】:

    您确定有问题的文件存在吗?根据您的回复,您会得到HttpStatusCode: 204,这意味着有no content available 带有您发送的参数。你能举一个你的桶/键值的例子吗? IE。显示您传递给这些变量的字符串的确切结构?

    【讨论】:

      【解决方案3】:

      这是一个相当简单的解决方案,我的项目存储在一个文件夹结构中,我需要传递文件夹位置以及项目密钥。

      def remove_aws_object(bucket_name, item_key):
          ''' Provide bucket name and item key, remove from S3
          '''
          folder = "foo/bar/"
          delete_key = folder + item_key
          s3_client = boto3.client('s3',
                                   aws_access_key_id=AWS_ACCESS_KEY,
                                   aws_secret_access_key=AWS_SECRET)
          delete = s3_client.delete_object(Bucket=bucket_name, Key=delete_key)
      

      【讨论】:

        猜你喜欢
        • 2019-07-18
        • 1970-01-01
        • 2015-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        • 2018-09-21
        • 1970-01-01
        相关资源
        最近更新 更多