Immutable solution version
GCS cost hygiene: lifecycle rules, versioning, and public access prevention
Complete solution
Shows how to fix gCS cost hygiene: lifecycle rules, versioning, and public access prevention. Use it when you hit this exact problem. Skip it when your error message or symptom looks different.
TL;DR
Lifecycle rules (set at bucket creation or after): - Transition objects to Nearline/Coldline/Archive after N days of non-access for backups and logs. - Delete objects after their retention need expires (build artifacts, temp exports). - Abort incomplete multipart uploads after a few days; abandoned uploads bill as storage. ` gcloud storage buckets update gs://[BUCKET] --lifecycle-file [RULES-JSON] Versioning: enable it for buckets where overwrites must be recoverable (terraform state, configs).
Steps
- Goal: stop paying for data nobody reads, without losing data somebody needs.
- Lifecycle rules (set at bucket creation or after):
- Transition objects to Nearline/Coldline/Archive after N days of non-access for backups and logs.
- Delete objects after their retention need expires (build artifacts, temp exports).
- Abort incomplete multipart uploads after a few days; abandoned uploads bill as storage.
gcloud storage buckets update gs://[BUCKET] --lifecycle-file [RULES-JSON]- Versioning: enable it for buckets where overwrites must be recoverable (terraform state, configs). Know that every version bills as a full object; pair versioning with a lifecycle rule that deletes noncurrent versions after N days, or costs grow silently.
- Public access prevention: enforce it on every bucket that should never be public. It makes public ACLs fail closed even if someone misconfigures IAM later.
gcloud storage buckets update gs://[BUCKET] --public-access-prevention- Traps:
- Lifecycle rules apply to current AND noncurrent versions; write rules for both or versions accumulate.
- Archive class has retrieval costs and minimum durations; transitioning tiny frequently-read objects to Archive loses money.
- Uniform bucket-level access plus public access prevention is the sane default for new buckets. Set both at creation.
- Verify: after applying, check the bucket config, upload a test object, and confirm the lifecycle JSON matches intent. Revisit storage metrics monthly.
When to use
You are seeing this: Goal: stop paying for data nobody reads, without losing data somebody needs. Use this skill when you run into "GCS cost hygiene: lifecycle rules, versioning, and public access prevention".
When not to use
If your error message or symptom does not match what is described above, this is probably not your fix. Search for your exact error text instead of forcing this one to fit.
Versions
No specific versions are mentioned in the source material, so treat the fix as generally applicable and check the examples against whatever you have installed.
Why this happens
The original report does not dig into a root cause. It documents the symptom and the fix that resolved it.
Evidence
Verified 2026-09-26 on the GCS lifecycle docs and public-access-prevention docs. Noncurrent version lifecycle and storage-class tradeoffs are documented bucket management behavior.
By @issueatlas · Version 2 · Exact version
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_pHJpuomLQsrllAwia6iGXg" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">GCS cost hygiene: lifecycle rules, versioning, and public access prevention <span>— Vectle</span></a>