AWS cost · S3 multipart uploads
The S3 cost you cannot see: incomplete multipart uploads
This is the rare AWS cost you cannot find by browsing your account. Large files upload to S3 in parts, and when an upload fails partway - a dropped connection, a crashed job, a client that gave up - the parts already sent stay behind. They are stored and billed like any other data, month after month. But they never assemble into an object, so the S3 console does not list them. You can open the bucket, see nothing unusual, and still be paying for gigabytes of abandoned upload fragments. It is a leak you have to know exists to even look for.
Interrupted S3 uploads leave parts that bill like stored objects but never appear in the console object list. They accumulate quietly and never clean up on their own. One lifecycle rule with AbortIncompleteMultipartUpload deletes any upload that has not finished within a few days - with no early-delete charge for removing the parts.
Why is this cost invisible?
Four things make it the perfect hidden charge:
| What is true | Detail |
|---|---|
| Charged like stored objects | at the storage class the parts were uploaded as |
| Invisible in the S3 console | the object list does not show incomplete uploads |
| Never clean up on their own | parts sit until the upload completes or is aborted |
| Fixed by one lifecycle rule | AbortIncompleteMultipartUpload after N days |
How does the data build up?
Every failed upload of a large file leaves its parts behind, and failed uploads are routine - backup jobs, data pipelines, and clients uploading big files all drop connections sometimes. Each failure is small, but they never get cleaned up, so they compound in exactly the way the rest of an S3 bill does: data goes in, nothing comes out, and no single event is big enough to notice.
How do I find and clean them up?
You can list the hidden uploads on a bucket directly, but the durable fix is a lifecycle rule that aborts any upload not finished within a few days - set it once and it cleans up failures forever. This surfaces what is there now, then applies the rule:
# the incomplete uploads the console hides
aws s3api list-multipart-uploads --bucket my-bucket \
--query 'Uploads[].{Key:Key,Initiated:Initiated}' --output table
# lifecycle rule: abort any upload not finished within 7 days
aws s3api put-bucket-lifecycle-configuration --bucket my-bucket \
--lifecycle-configuration '{
"Rules": [{
"ID": "abort-incomplete-uploads",
"Status": "Enabled",
"Filter": { "Prefix": "" },
"AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 }
}]
}'Want to know if abandoned uploads are padding your S3 bill? Connect your account read-only and see what it is wasting, in real dollars.
The role can only read - Get, Describe, List, nothing else. Read the exact permissions before you deploy it, and delete the stack whenever you want.
Frequently asked questions
What are incomplete multipart uploads in S3?+
When a large file is uploaded to S3 in parts and the upload is interrupted before it finishes, the parts already uploaded are kept. They are not assembled into a visible object, but they are stored - and billed - until the upload is completed or explicitly aborted.
Do incomplete multipart uploads cost money?+
Yes. You pay for the stored parts at the storage class they were uploaded as, the same as any stored data, every month until they are removed. Because failed uploads happen quietly and often, the parts can accumulate into a meaningful amount of storage nobody accounted for.
Why can I not see incomplete multipart uploads in the console?+
The S3 object list only shows completed objects, and incomplete uploads are not completed objects - so they do not appear there. This is exactly why they are such a common hidden cost: the storage bills every month but never shows up when you browse the bucket, so nobody knows to clean it up.
How do I find incomplete multipart uploads?+
Use the ListMultipartUploads API on a bucket - it returns the in-progress uploads the console hides. That gives you the inventory of what is quietly stored. For a routine fix you do not even need to look; a lifecycle rule cleans them up automatically going forward.
How do I stop paying for incomplete multipart uploads?+
Add an S3 lifecycle rule with an AbortIncompleteMultipartUpload action set to a few days. It automatically deletes the parts of any upload that has not completed within that window, on every bucket you apply it to. There are no early-delete charges for removing incomplete upload parts.
Is it safe to abort incomplete multipart uploads?+
Yes, with a sensible window. Setting the rule to abort after 7 days gives any legitimate in-progress upload far more time than it needs to finish, while cleaning up the failed ones that will never complete. A completed upload is unaffected - the rule only touches parts still waiting to be assembled.
Related cost breakdowns
ECR storage costs $0.10/GB - and CI builds pile it up
ECR stores container images at $0.10/GB-month, and every CI build pushes layers that never expire on their own. Without a lifecycle policy the bill climbs forever - here is how to cap it.
Orphaned EBS snapshots are quietly draining your AWS bill
EBS snapshots cost $0.05/GB-month and never delete themselves. Forgotten ones pile up into hundreds a month. Here is how to find the orphans and automate cleanup.
Why your S3 bill keeps growing - and how to stop it
Cold backups sit in S3 Standard at ~$46/month per 2 TB when Glacier Deep Archive is ~$2/month for the same files. One lifecycle rule moves them automatically.
Switch EBS gp2 to gp3 and cut 20% with no downtime
gp3 volumes cost $0.08/GB-month against gp2's $0.10 - 20% less at the same or better performance, with a live migration and no downtime. Here is the one command.