S3の不完全なマルチパートアップロードをawscliで一括削除する

s3 storage lensとかcost explorerとか見てたらなんかオブジェクトとかコスト多いなとなって、s3の不完全なマルチパートアップロードが溜まってるぽかった
消し方について軽くググると、バケットライフサイクルでやる方法は多く出てくるものの、アドホックに消す方法がパッと分からなかった
不完全なマルチパートアップロードを、ライフサイクルでなく、awscliでガッと消す方法を書く

マルチパートアップロードを一覧する

aws s3api list-multipart-uploads --bucket <bucket> でマルチパートアップロード一覧を取れる レスポンスは以下のような感じ

{
    "Uploads": [
        {
            "UploadId": "<upload id>",
            "Key": "<s3のオブジェクトキー>",
            "Initiated": "",
            "StorageClass": "",
            "Owner": {},
            "Initiator": {}
        }
    ]
}

aws s3api list-multipart-uploads --bucket <bucket> | jq '.Uploads | length' とかで不完全なマルチパートアップロード件数を確認できる

マルチパートアップロードを中止する(削除する)

aws s3api abort-multipart-uploads --bucket <bucket> --key <key> --upload-id <upload id> でマルチパートアップロードを中止できる
https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html

jqを使ってバケット一括でabort-multipart-uploadsする

 aws s3api list-multipart-uploads --bucket ${BucketName} \
   | jq -r '.Uploads[] | "\(.UploadId) \(.Key)"' \
   | while read -r i k; do aws s3api abort-multipart-upload --bucket ${BucketName} --key $k --upload-id $i; done

ほんとはInitiatedの日付を見てちゃんと判定したりする必要もありそうだけど、そこは状況、要件に合わせて(というかちゃんとやりたければライフサイクルでやればいい)
自分は全部消していい状況だったので全部消した