Как прервать все неполные многостраничные загрузки для ведра

Иногда многопользовательские загрузки зависают или не заполняются по какой-либо причине. В этом случае вы застряли с потерянными частями, которые сложно удалить. Вы можете перечислить их с помощью:

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

Я ищу способ прервать их всех.

Ответ 1

Предполагая, что у вас есть ваша настройка 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

Ответ 2

Если вы выполняете многостраничную загрузку, вы также можете создать панель управления S3 Management.

a) Откройте ведро S3

b) Перейдите на вкладку "Управление"

c) Нажмите " Добавить правило жизненного цикла"

d) Теперь введите имя правила на первом шаге и установите флажок Очистить неполные многостраничные загрузки. Теперь у вас есть количество дней, чтобы сохранить неполные части.

Это. Вы также можете увидеть эти шаги в прикрепленном скриншоте.

Steps to add rule

Ответ 3

Вы можете настроить правила жизненного цикла, чтобы автоматически очистить их через некоторое время. Здесь сообщение в блоге, демонстрирующее, как это сделать в консоли:

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

Ответ 4

В качестве альтернативы вы можете использовать Minio Client aka mc Он является открытым исходным кодом и совместим с AWS S3.

Перечислить всю неполную загрузку в связанном ведре.

$ mc ls -I s3/mybucketname

Чтобы удалить все незавершенные загрузки в соответствующий ведро S3.

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

I = неполный r = рекурсивный f = с параметром силы

Надеюсь, что это поможет.

Отказ от ответственности: я работаю для Minio.

Ответ 5

Вот мой 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