# GCP GCS Bucket Missing Lifecycle Policy

> Buckets with zero lifecycle rules never transition aging objects to Nearline or Coldline, so old data bills at Standard rates forever. ZopNight detects the missing policy from the bucket record but currently abstains from a dollar figure: GCP exposes no object-age metric, so the eligible bytes cannot be measured.

Source: https://zop.dev/integrations/gcp/recommendations/gcp-gcs-bucket-missing-lifecycle-policy
Updated: 2026-08-19

---

## What a missing policy costs

Lifecycle rules are the only mechanism that moves objects between storage classes or
deletes them on age without anyone remembering to. A bucket with none configured
accumulates logs, build artifacts, and abandoned exports at Standard rates indefinitely.
The classic shape is a CI bucket that has been appending for 3 years. The detection reads
the bucket's own configuration, stamped by the discoverer as
`lifecycle_policy_present=false` from the live bucket record via `storage.buckets.get`
(carried in `roles/storage.admin` in ZopNight's catalog), and fires only when that flag is
positively false; an unknown state is skipped.

## Why this page shows no savings number

An age-based lifecycle saving is (bytes old enough to transition) × (rate difference). The
second factor is known; the first has no producer. Cloud Monitoring's
`storage/total_bytes` breaks capacity down by storage class but carries no age axis, and
GCP publishes no "bytes older than N days" metric at all. The two data sources that do
know object ages (Storage Insights inventory reports and a raw object listing) require
per-bucket export pipelines or pagination over potentially billions of objects. Rather
than pretend every Standard byte is transition-eligible, or borrow the 50% figure that
belongs to the separate cold-access reclass rule and double-count it, the rule abstains:
it emits nothing until a real age split exists.

## Inspect a bucket's lifecycle config

```bash
gcloud storage buckets describe gs://my-bucket \
  --format="default(lifecycle_config)"
```

A null result is exactly the state this rule flags. Adding a first policy, say transition
to Nearline at 30 days and delete at 365, takes one `gcloud storage buckets update
--lifecycle-file` call and applies to existing objects on their next age evaluation.

## Distinct from the Nearline reclass rule

RC-1233 answers a different question: should this bucket's *default* class change because
measured access is cold? That rule prices a real Standard-to-Nearline delta from the whole
bucket's bill. This rule is about aging *subsets* of a bucket that stays hot at the front.
Applying both figures to one bucket would count the same bytes twice, which is precisely
why this one holds its number back.
