如何中止存储桶的所有不完整的分段上传

时间:2016-09-12 19:30:18

标签: amazon-s3 jq aws-cli

有时,由于某些原因,分段上传会挂起或完成。在这种情况下,你会遇到难以移除的孤立部分。您可以列出:

aws s3api list-multipart-uploads --bucket $BUCKETNAME

我正在寻找让他们全部中止的方法。

5 个答案:

答案 0 :(得分:7)

假设您拥有awscli所有设置并且输出JSON,您可以使用jq投影所需的密钥:

BUCKETNAME=<xxx>
aws s3api list-multipart-uploads --bucket $BUCKETNAME \
| jq -r '.Uploads[] | "--key \"\(.Key)\" --upload-id \(.UploadId)"' \
| while read -r line; do
    eval "aws s3api abort-multipart-upload --bucket $BUCKETNAME $line";
done

答案 1 :(得分:3)

如果要分段上传,则也可以执行S3管理控制台的清理表单。

a)打开您的S3存储桶

b)切换到管理标签

c)点击添加生命周期规则

d)现在,在第一步中输入规则名称,并选中清理不完整的分段上传复选框。现在,您也输入保留不完整零件的天数。

就是这样。您也可以在所附的屏幕截图中看到这些步骤。

Steps to add rule

答案 2 :(得分:2)

您可以设置生命周期规则,以便在一段时间后自动清除这些规则。这是一篇博客文章,演示如何在控制台中执行此操作:

https://aws.amazon.com/blogs/aws/s3-lifecycle-management-update-support-for-multipart-uploads-and-delete-markers/

在boto3中执行此操作:

import boto3


s3 = boto3.client('s3')
try:
    lifecycle = s3.get_bucket_lifecycle(Bucket='bucket')
except ClientError:
    lifecycle = {'Rules': []}
lifecycle['Rules'].append({
    'ID': 'PruneAbandonedMultipartUploads',
    'Status': 'Enabled',
    'Prefix': '',
    'AbortIncompleteMultipartUpload': {
        'DaysAfterInitiation': 7
    }
})
s3.put_bucket_lifecycle(Bucket='bucket', LifecycleConfiguration=lifecycle)

在cli中添加该配置将大致相同:

$ aws s3api get-bucket-lifecycle --bucket bucket > lifecycle.json
# Edit the lifecycle, adding the same configuration as in the boto3 sample
$ aws s3api put-bucket-lifecycle --bucket bucket --lifecycle-configuration file://lifecycle.json

如果您的广告连播没有生命周期政策,get-bucket-lifecycle将提出ClientError。强大的实现将确保返回正确的错误。

仅具有该配置的策略如下所示:

{
    "Rules": [
        {
            "ID": "PruneAbandonedMultipartUpload",
            "Status": "Enabled",
            "AbortIncompleteMultipartUpload": {
                "DaysAfterInitiation": 7
            }
        }
    ]
}

答案 3 :(得分:2)

您也可以使用Minio Client aka mc它是开放源代码并与AWS S3兼容。

列出关联存储桶上的所有未完成上传。

$ mc ls -I s3/mybucketname

删除所有未完成的上传到关联的S3存储桶。

$ mc rm -I -r --force s3/mybucketname

我=不完整 r =递归 f =使用强制选项

希望它有所帮助。

免责声明:我为Minio工作。

答案 4 :(得分:0)

这是我的单行纸,假设您的密钥/文件名中没有空格,则无论状态如何,它都会中止所有分段上传。

BUCKETNAME=<xxx>;aws s3api list-multipart-uploads --bucket $BUCKETNAME --query 'Uploads[].[Key, UploadId]' --output text | awk  '{print "aws s3api abort-multipart-upload --upload-id "$2" --bucket $BUCKETNAME --key " $1 " & wait"}{}' | bash