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