← All insights

S3 Storage Costs Rising? Find Abandoned Multipart Uploads Before Deleting Objects

Investigate S3 storage from abandoned multipart uploads, choose a safe abort threshold, and validate cleanup without deleting completed customer files.

S3 Storage Costs Rising? Find Abandoned Multipart Uploads Before Deleting ObjectsS3 Storage Costs Rising? Find Abandoned Multipart Uploads Before Deleting Objects: Upload session, Stored parts, Completion gate, Lifecycle cleanup.. Conceptual teaching illustration; connections show the investigation flow rather than a vendor deployment topology.CLOUVENIX / AWSS3 Storage Costs Rising? Find Abandoned Multipart Uploads Before DeletingObjects01Upload session02Stored parts03Completion gate04Lifecycle cleanupConceptual investigation flow. Validate the actual environment and application behaviour.
S3 Storage Costs Rising? Find Abandoned Multipart Uploads Before Deleting Objects: Upload session, Stored parts, Completion gate, Lifecycle cleanup.

Context

An object storage bill can grow even when the application shows few new files. One possible explanation is an upload that started but never finished. Large uploads often send a file in separate parts. If a browser closes, a worker crashes, or a mobile connection disappears, those parts may remain even though the final object never appears in the usual application listing.

Imagine a property platform whose customers upload large videos over unreliable connections. The product team sees failed uploads, the storage team sees more bytes, and each assumes the other view is wrong. They may both be correct. The investigation needs to distinguish completed objects, older versions, and incomplete multipart upload parts.

Understand the storage you are investigating

S3 provides an AbortIncompleteMultipartUpload lifecycle action. An upload becomes eligible for abort after the configured number of days since initiation, and S3 removes its uploaded parts when the abort is performed. The action applies to incomplete uploads, including existing ones, and does not delete completed objects. It is different from an object expiration rule. 1

That distinction should appear in the change request. A statement such as “delete old files after seven days” describes a different operation and creates avoidable anxiety. Describe the exact population: unfinished upload sessions older than the chosen threshold, within the intended bucket scope.

Establish a baseline before changing policy

Record the bucket, owning application, environment, and current lifecycle configuration. Inventory incomplete upload sessions with their initiation times and object keys using appropriately scoped tooling. Handle pagination explicitly. A result containing the first page is not evidence that the rest of the bucket is empty.

For a representative sample, inspect the associated parts and connect the upload initiation to application logs. Group by age, prefix, and uploader workflow. This often reveals a specific release or client type generating abandoned sessions. Keep the investigation read-only until the population is understood, and avoid publishing customer filenames in a general incident channel.

Choose the abort age from actual behaviour

A fixed seven-day example is easy to copy but may be wrong for a workflow that intentionally resumes uploads over several days. Ask the product owner how long a user is allowed to resume, whether offline clients persist upload identifiers, and what happens when the identifier no longer exists. Include weekend behaviour and long-running machine transfers in that decision.

Set the threshold beyond the supported resume window, with a documented margin. If separate workloads need different windows, consider whether prefix-based lifecycle scoping matches their actual key design. Do not assume application tags on eventual objects identify incomplete sessions in the same way; validate the lifecycle filter supported for the intended action.

Change one control without replacing unrelated rules

Export the complete lifecycle configuration before editing. Review the proposed result as a whole because an automated update that writes only the new rule can accidentally remove existing rules. Check rule IDs, scope, status, and the distinction between multipart abort and object expiration. A peer should be able to identify the changed action without reconstructing the entire bucket history.

Use a nonproduction bucket to test a deliberately incomplete upload and a completed control object. The intended result is eventual removal of the abandoned parts while the completed object remains readable. Lifecycle work is asynchronous, so absence of immediate deletion is not by itself a failed rollout. Define an observation window rather than promising cleanup at an exact second.

Fix the uploader that creates the waste

Lifecycle policy limits accumulation; it does not explain why uploads fail. Review client cancellation, server timeouts, retry behaviour, and the cleanup path when an upload is explicitly abandoned. A job should retain enough information to reconcile its upload session after a worker restart. A request timeout does not necessarily prove that no part reached storage.

Give the user a clear recovery path. If an old upload has expired, offer a fresh upload rather than repeatedly retrying an invalid session. Record separate outcomes for cancelled, expired, completed, and failed uploads. These states help support teams distinguish a cleanup policy working correctly from an application regression.

Measure savings and customer impact separately

Compare incomplete upload bytes and session age distributions over comparable reporting periods. Separate storage reduction from pricing changes, normal business growth, version retention, and object lifecycle transitions. An illustrative reduction in bytes is not a guaranteed reduction of the same percentage in the total bill, which may include requests and data transfer.

Monitor completion rate, resume success, customer complaints, and restart attempts alongside storage. If costs fall because legitimate transfers are being aborted too soon, the change has failed its business objective. Keep the old policy export and a documented procedure for changing the threshold, while recognising that already aborted upload parts cannot simply be restored by reverting a rule.

A focused operator exercise: A cleanup threshold example

Suppose a product promises that an interrupted transfer can resume for three days. The team should choose an abort threshold that preserves that promise with an agreed margin, then test uploads immediately inside and outside the supported window. These are product-specific planning values, not an S3 default or a universal recommendation.

Keep a completed control object and an intentionally unfinished upload in the exercise bucket. Compare their states after the lifecycle observation window and test how the client explains an expired session. The acceptance decision should show that unfinished storage is removed while supported customer recovery still works, with no claim that a policy reversal can reconstruct aborted parts.

Quick diagnostic map

EvidenceReviewAcceptance boundary
Stored partsInventory incomplete uploads and their ageSeparate parts from completed objects
Lifecycle scopeReview prefix and tag filtersProtect legitimate long-running uploads
Cleanup resultCompare inventory after the retention thresholdConfirm new uploads still complete

Frequently asked questions

Will this remove my completed media? The multipart abort action does not expire completed objects. Other lifecycle actions in the same configuration must be reviewed independently.

What proves the work is complete? Show the scoped policy, the age distribution before and after, a preserved completed test object, and a successful supported resume workflow. Clouvenix can combine this storage review with uploader diagnostics so cost control and user experience improve together.

For a scoped review of this workflow, discuss the relevant Clouvenix engineering service.

Technical reference