Amazon s3 如何中止bucket的所有未完成的多部分上载

Amazon s3 如何中止bucket的所有未完成的多部分上载,amazon-s3,jq,aws-cli,Amazon S3,Jq,Aws Cli,有时,由于某些原因,多部分上载会挂起或无法完成。在这种情况下,您会被孤立的零件卡住,这些零件很难移除。您可以通过以下方式列出它们: aws s3api list-multipart-uploads --bucket $BUCKETNAME 我正在寻找方法来中止它们。假设您有awscli所有设置,并且它将输出JSON,您可以使用jq投射所需的密钥: BUCKETNAME=<xxx> aws s3api list-multipart-uploads --bucket $BUCKETNA

有时,由于某些原因,多部分上载会挂起或无法完成。在这种情况下,您会被孤立的零件卡住,这些零件很难移除。您可以通过以下方式列出它们:

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
BUCKETNAME=
aws s3api列表多部分上载--bucket$BUCKETNAME\
|jq-r'.Uploads[]|“--key\”\(.key)\“--upload id\(.UploadId)”'\
|而read-r行;做
eval“aws s3api中止多部分上传——bucket$BUCKETNAME$line”;
完成

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

要在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
如果bucket上没有生命周期策略,
get bucket lifecycle
将引发
ClientError
。一个健壮的实现将确保返回正确的错误

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

{
    "Rules": [
        {
            "ID": "PruneAbandonedMultipartUpload",
            "Status": "Enabled",
            "AbortIncompleteMultipartUpload": {
                "DaysAfterInitiation": 7
            }
        }
    ]
}
您也可以使用它,因为它是开源的,并且与AWS S3兼容

列出关联bucket上所有未完成的上载

$ mc ls -I s3/mybucketname
删除所有未完成的上传到相关S3存储桶

$ mc rm -I -r --force s3/mybucketname
I=不完整 r=递归 f=带强制选项

希望能有帮助


免责声明:我为。

如果您正在进行多部分上传,您也可以执行清理表单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 "$2" --bucket $BUCKETNAME --key " $1 " & wait"}{}' | bash
BUCKETNAME=;aws s3api列表多部分上载--bucket$BUCKETNAME--查询'uploads[].[Key,UploadId]'--输出文本| awk'{print“aws s3api中止多部分上载--上载id“$2”--bucket$BUCKETNAME--Key“$1”&wait”}{}bash
Riz一个问题:如果今天(8月13日)我设置了多部分清理规则(1天)。那么,此规则是否会删除1日(8月10日)之前创建的对象?