有时,由于某些原因,分段上传会挂起或完成。在这种情况下,你会遇到难以移除的孤立部分。您可以列出:
aws s3api list-multipart-uploads --bucket $BUCKETNAME
我正在寻找让他们全部中止的方法。
答案 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)现在,在第一步中输入规则名称,并选中清理不完整的分段上传复选框。现在,您也输入保留不完整零件的天数。
就是这样。您也可以在所附的屏幕截图中看到这些步骤。
答案 2 :(得分:2)
您可以设置生命周期规则,以便在一段时间后自动清除这些规则。这是一篇博客文章,演示如何在控制台中执行此操作:
在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