The problem
Multipart uploads are common for large objects, but interrupted or abandoned uploads can leave partial data in S3 indefinitely. Those parts continue to incur storage charges until the upload is explicitly aborted or lifecycle rules clean them up.
Why it happens
- Upload clients fail mid-transfer and never abort the original multipart session.
- Build, export, or ingestion pipelines leave partial uploads behind after transient failures.
- Buckets may have object lifecycle rules, but no abort cleanup for incomplete multipart state.
What this means for cost
Estimated monthly
$25 to $600/mo
Estimated annual
$300 to $7,200/yr
This waste pattern often shows up as $25 to $600/mo in recurring monthly cost, or roughly $300 to $7,200/yr if it sits untouched for a year.
How to detect S3 incomplete multipart uploads
The strongest signal is a bucket that still has open multipart upload sessions even though the related job, client, or pipeline already failed or disappeared.
Inspect the bucket for open multipart uploads:
aws s3api list-multipart-uploads --bucket my-bucket
If you see uploads that are days or weeks old, confirm that the bucket lifecycle configuration includes AbortIncompleteMultipartUpload.
aws s3api get-bucket-lifecycle-configuration --bucket my-bucket
This issue is especially common in buckets used for build artifacts, large exports, or ingestion pipelines.
What this detector actually checks
Cloud Waste Hunter only raises a finding when both of these conditions are true:
- the bucket currently has incomplete multipart uploads
- the bucket does not have an enabled
AbortIncompleteMultipartUploadlifecycle rule
That boundary matters. This detector is intentionally narrower than general lifecycle cleanup checks. A bucket that merely lacks lifecycle policy is not enough by itself.
How to fix S3 incomplete multipart uploads
Add a lifecycle rule that aborts incomplete multipart uploads after a short window.
resource "aws_s3_bucket_lifecycle_configuration" "artifacts" {
bucket = aws_s3_bucket.artifacts.id
rule {
id = "abort-stale-multipart"
status = "Enabled"
abort_incomplete_multipart_upload {
days_after_initiation = 7
}
}
}
If an application regularly leaves open uploads, also review its error handling. Lifecycle cleanup prevents indefinite storage charges, but it does not fix the underlying upload failure path.
Caveats and overlap boundaries
Fresh in-progress uploads are normal. The detector becomes most useful when older uploads accumulate and the bucket still lacks abort cleanup. It also biases toward under-detection rather than noise because any enabled abort rule is treated as sufficient in v1, even if filters may not cover every upload path.
If the broader issue is noncurrent object retention rather than abandoned upload state, that is a separate storage-policy problem. This detector is only about currently open multipart sessions and missing abort cleanup, not historical object versions or generic lifecycle coverage.
How Cloud Waste Hunter helps
Cloud Waste Hunter can flag buckets that currently expose incomplete multipart upload activity without an enabled abort cleanup rule, surface the affected bucket names and upload counts, and point operators to the lifecycle fix first. For adjacent storage cleanup patterns, review the AWS Storage Cost Optimization guide.
FAQ
Do incomplete multipart uploads show up as normal S3 objects?
No. They are stored parts tied to unfinished uploads, so they can be overlooked unless you explicitly inspect multipart upload state or bucket lifecycle rules.
Does any lifecycle rule suppress this detector?
No. v1 only suppresses findings when it sees an enabled `AbortIncompleteMultipartUpload` rule, and it currently treats any enabled abort rule as aligned even if the rule is prefix- or tag-scoped.