GCE instance stuck in PROVISIONING state
gcloud compute instances list shows PROVISIONING for minutes
Focused incident mode — strips away everything but this runbook.
Symptoms
- gcloud compute instances list shows PROVISIONING for minutes
- Instance is not RUNNING despite start request succeeding
- SSH attempts fail even though the operation reported success
- New MIG replicas hang before they can serve traffic
PROVISIONING is normally seconds; if it persists past a few minutes the placement is blocked by capacity, quota, or a reservation. Do not delete the VM before checking operations — you can lose the attached disk.
Evidence to grab
Collect these artifacts before you change anything — they prove (or rule out) each cause.
Instance state and last operation
gcloud compute instances describe <INSTANCE> --zone=<ZONE> --format='value(status,lastStartTimestamp)'Recent compute operations
gcloud compute operations list --filter='targetLink~<INSTANCE>' --format='table(name,operationType,status,insertTime)'
Diagnostic flow
Run the steps in order, marking each claim confirmed or refuted. The evidence you gather feeds the ranked causes below.
Guided decision tree is ready.
Steps with commands, expected output, and pass/fail branches.
Ranked root causes
Evidence checklist
- Multiple VM starts hang in PROVISIONING at the same time
- gcloud compute zones shows reduced availability or quota nearly exhausted
- Start operation stays RUNNING for a long time
Confirm before fixing
gcloud compute regions describe <REGION> --format='value(quotas)'Inspect remaining quota in the region
Expected: CPUS_ALL_REGIONS quota with available headroom
Fix
gcloud compute instances move <INSTANCE> --zone=<ZONE> --destination-zone=<ALT_ZONE>Move the VM to a healthier zone if the current one is degraded
Expected: Instance [<INSTANCE>] moved...
Resolution runbook
Apply from top to bottom after the cause is confirmed. Review every command before running it — risk tags are shown on each.
gcloud compute instances describe <INSTANCE> --zone=<ZONE> --format='value(status)'Confirm the stuck state
gcloud compute operations list --filter='targetLink~<INSTANCE>' --limit=10 --format='table(name,operationType,status,error)'Look for an errored or hung start operation
gcloud compute instances start <INSTANCE> --zone=<ZONE>Retry start if a transient error is present
gcloud compute instances move <INSTANCE> --zone=<ZONE> --destination-zone=<ALT_ZONE>Move to another zone if the current one is under capacity
Prevention
- Spread critical instances across multiple zones so a capacity stall hits them one at a time.
- Reserve CUD/reservations for machine types you depend on in hot zones.
- Monitor instance group provisioning by adding an SLA on time-to-RUNNING.
- Keep start/stop retry logic in provisioning scripts instead of manual intervention.
Related runbooks
Same stack, same failure family — worth a skim.
gcloud compute instances start returns error GCE_INTERNAL_ERROR
gcloud container node-pools list shows node pool state UNKNOWN or unhealthy
Commands marked READ CHANGE DESTRUCTIVE — never run DESTRUCTIVE commands against production data you cannot restore. Copy → verify → execute.