web-dev-qa-db-ja.com

バケットのすべての不完全なマルチパートアップロードを中止する方法

マルチパートアップロードがハングしたり、何らかの理由で完了しない場合があります。その場合、削除するのが難しい孤立したパーツで立ち往生しています。あなたはそれらをリストすることができます:

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

私はそれらすべてを中絶する方法を探しています。

12

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
12

マルチパートアップロードを実行している場合は、S3管理コンソールからクリーンアップを実行することもできます。

a)S3バケットを開きます

b)管理タブに切り替えます

c)ライフサイクルルールの追加をクリックします

d)最初のステップでルール名と入力し、不完全なマルチパートアップロードのクリーンアップチェックボックスをオンにします。ここで、不完全なパーツも保持する日数を入力します。

それでおしまい。これらの手順は、添付のスクリーンショットでも確認できます。

Steps to add rule

4
Riz

または、 Minio Client aka mc を使用することもできます。これはオープンソースであり、AWSS3と互換性があります。

関連付けられたバケットのすべての不完全なアップロードを一覧表示します。

$ mc ls -I s3/mybucketname

関連するS3バケットへの不完全なアップロードをすべて削除します。

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

I =不完全r =再帰的f =強制オプションあり

それが役に立てば幸い。

免責事項:私は Minio で働いています。

2
koolhead17

ライフサイクルルールを設定して、しばらくすると自動的にそれらを削除できます。これは、コンソールでそれを行う方法を示すブログ投稿です。

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-lifecycleClientErrorを発生させます。堅牢な実装により、正しいエラーが返されるようになります。

その構成のみのポリシーは次のようになります。

{
    "Rules": [
        {
            "ID": "PruneAbandonedMultipartUpload",
            "Status": "Enabled",
            "AbortIncompleteMultipartUpload": {
                "DaysAfterInitiation": 7
            }
        }
    ]
}
2
Jordon Phillips

これが私のワンライナーです。キー/ファイル名にスペースがないと仮定すると、ステータスに関係なくすべてのマルチパートアップロードを中止します。

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
0
Stephen Schulte