如何中止存储桶的所有未完成分段上传
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 演示如何在控制台中执行此操作:
要在 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
有时分段上传由于某种原因挂起或未完成。在那种情况下,您会遇到难以移除的孤立部分。您可以列出它们:
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 演示如何在控制台中执行此操作:
要在 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