如何中止存储桶的所有未完成分段上传

howto abort all incomplete multipart uploads for a bucket

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

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

我正在寻找将它们全部中止的方法。

假设您已完成 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

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

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

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

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

$ mc ls -I s3/mybucketname

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

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

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

希望对您有所帮助。

免责声明:我为 Minio.

工作

如果您正在进行分段上传,您也可以清理表单 S3 管理控制台。

a) 打开您的 S3 存储桶

b) 切换到管理选项卡

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

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

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

这是我的 oneliner,它将中止所有分段上传,无论状态如何,假设您的密钥/文件名中没有任何空格。

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