マルチパートアップロードがハングしたり、何らかの理由で完了しない場合があります。その場合、削除するのが難しい孤立したパーツで立ち往生しています。あなたはそれらをリストすることができます:
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
または、 Minio Client aka mc を使用することもできます。これはオープンソースであり、AWSS3と互換性があります。
関連付けられたバケットのすべての不完全なアップロードを一覧表示します。
$ mc ls -I s3/mybucketname
関連するS3バケットへの不完全なアップロードをすべて削除します。
$ mc rm -I -r --force s3/mybucketname
I =不完全r =再帰的f =強制オプションあり
それが役に立てば幸い。
免責事項:私は Minio で働いています。
ライフサイクルルールを設定して、しばらくすると自動的にそれらを削除できます。これは、コンソールでそれを行う方法を示すブログ投稿です。
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
}
}
]
}
これが私のワンライナーです。キー/ファイル名にスペースがないと仮定すると、ステータスに関係なくすべてのマルチパートアップロードを中止します。
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