awss3storagecost-optimization

S3 multipart upload cost: the incomplete uploads billing silently

S3 multipart upload is efficient for large files, but abandoned or failed uploads leave parts stored and billing forever, invisible in the normal object listing. Here is how the request and storage costs work, and the one lifecycle rule that stops the silent leak.

The C3X Team··5 min read

Quick answer

S3 multipart upload bills a PUT request per part ($0.005 per 1,000 in us-east-1) plus normal storage once the upload completes. The trap is that failed or abandoned uploads leave the already-uploaded parts stored at the full storage rate, and those parts do not appear in the normal object listing, so they bill indefinitely and invisibly. The fix is a one-line lifecycle rule, AbortIncompleteMultipartUpload after 7 days, applied to every bucket, which deletes orphaned parts automatically and can recover buckets silently holding terabytes of dead upload fragments.

Multipart upload is how S3 handles large objects: the file is split into parts, each uploaded independently and in parallel, then assembled with a completion call. It is faster and more resilient than a single PUT for anything over about 100 MB, and required above 5 GB. The cost mechanics are simple until an upload fails halfway, at which point they become one of the most common sources of invisible S3 spend.

What a completed upload costs

Each part upload is a PUT, billed at $0.005 per 1,000 requests in us-east-1. A 5 GB file uploaded in 100 MB parts is 50 PUTs, a negligible fraction of a cent. Once you call CompleteMultipartUpload, the parts become a single object stored at the normal rate, $0.023 per GB-month in Standard. For completed uploads, the request cost is trivial and the storage cost is just the object size. Nothing surprising there.

The incomplete-upload trap

The problem is uploads that never complete. If a client crashes, loses its connection, or is simply abandoned, the parts already uploaded stay in S3, billed at the full storage rate, and they do not show up when you list the bucket's objects. They are only visible through the ListMultipartUploads API. On a busy bucket with flaky clients or a batch job that retries by starting fresh uploads, these orphaned parts accumulate steadily. Teams routinely find buckets holding hundreds of gigabytes to terabytes of incomplete-upload parts that have been billing for months with no one aware.

StateVisible in listing?Billing?
Completed objectYesYes, as one object
Incomplete upload partsNoYes, at full storage rate
After AbortIncompleteMultipartUploadNoNo, parts deleted

The one-line fix

Every bucket should carry a lifecycle rule with AbortIncompleteMultipartUpload set to a small number of days, commonly 7. It tells S3 to delete the parts of any multipart upload that has not completed within that window. There is no downside for legitimate uploads, which complete in seconds to minutes, and it permanently closes the leak. This is one of the highest-return, lowest-effort S3 cleanups available, and it belongs in your default bucket configuration alongside the other lifecycle rules. If you have never set it, audit existing buckets with ListMultipartUploads or Storage Lens first; the recovered storage is often substantial.

Right-sizing part size

Part size affects request count but rarely matters for cost, because PUTs are so cheap. A 100 GB file in 100 MB parts is 1,000 PUTs, half a cent. Smaller parts mean more requests and more retry granularity; larger parts mean fewer requests but more re-upload on a failed part. Optimize part size for throughput and reliability, not for the trivial request cost, and put the real money-saving effort into the abort rule. For a broader view of how S3 request fees add up, see S3 request fees explained.

Close the leak before it opens

Multipart upload cost is not about the parts you can see; it is about the ones you cannot. The completed-object cost is ordinary storage, but abandoned parts bill silently and invisibly until a lifecycle rule cleans them up. Set AbortIncompleteMultipartUpload on every bucket by default, and price your bucket configuration against the resource catalog so the cleanup rule is part of the design rather than a remediation you run after finding a surprise.

FAQ

How much does S3 multipart upload cost?

Each part upload is a PUT request at $0.005 per 1,000 in us-east-1, and once the upload completes the assembled object stores at the normal rate ($0.023 per GB-month in Standard). For completed uploads the request cost is trivial. The real cost risk is incomplete uploads, whose parts stay stored and billing until deleted.

Why do incomplete multipart uploads cost money?

When a multipart upload fails or is abandoned, the parts already uploaded remain in S3 and are billed at the full storage rate. They do not appear in the normal object listing, only through the ListMultipartUploads API, so they can accumulate to hundreds of gigabytes or terabytes and bill for months without anyone noticing.

How do I stop incomplete multipart uploads from billing?

Add a lifecycle rule with AbortIncompleteMultipartUpload set to a small number of days, commonly 7, on every bucket. It automatically deletes the parts of any upload that has not completed in that window. Legitimate uploads finish in seconds so there is no downside, and it permanently closes the leak.

Does S3 multipart part size affect cost?

Barely. PUT requests are so cheap ($0.005 per 1,000) that even a 100 GB file in 100 MB parts costs about half a cent in requests. Choose part size for throughput and retry granularity, not cost. The meaningful money is in cleaning up incomplete uploads, not in tuning part size.

How does C3X help with S3 multipart upload cost?

C3X prices S3 buckets from Terraform including their lifecycle configuration, so the presence or absence of an AbortIncompleteMultipartUpload rule is visible in the pull request. That prompts teams to add the cleanup rule as a default at design time, closing the invisible incomplete-upload leak before it can accumulate on a later bill.

What to do next

Stop paying for uploads that never finished. C3X prices S3 buckets and lifecycle rules from Terraform against a live resource catalog. Start with the quickstart.

Try C3X on your own Terraform

Free and open source. No API key required. One command to install, one command to estimate.