GCE_INTERNAL_ERROR / zone capacity SERVICE_UNAVAILABLE on start
gcloud compute instances start returns error GCE_INTERNAL_ERROR
Focused incident mode — strips away everything but this runbook.
Symptoms
- gcloud compute instances start returns error GCE_INTERNAL_ERROR
- Starting a VM fails with SERVICE_UNAVAILABLE or QUOTA_EXCEEDED
- MIG cannot add replicas because new instances fail to create
- Multiple resource types in the zone fail at once
For critical workloads, a multi-zone MIG is the only real defense against capacity exhaustion — a healthy zone cannot save you if the MIG pins to a single unavailable zone.
Evidence to grab
Collect these artifacts before you change anything — they prove (or rule out) each cause.
Exact error from the start/create operation
gcloud compute operations list --filter='targetLink~<INSTANCE>' --format='value(error.errors)'Regional quota headroom
gcloud compute regions describe <REGION> --format='value(quotas)'
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
- Error ZONE_RESOURCE_POOL_EXHAUSTED or GCE_INTERNAL_ERROR
- Other machine types start fine in the same zone
- Only new/extra capacity fails while running VMs are unaffected
Confirm before fixing
gcloud compute operations list --filter='error.code=ZONE_RESOURCE_POOL_EXHAUSTED OR error.code=GCE_INTERNAL_ERROR' --limit=10 --format='value(targetLink)'Confirm the class of capacity error
Expected: A list of operations that hit capacity errors
Fix
gcloud compute instances move <INSTANCE> --zone=<ZONE> --destination-zone=<ALT_ZONE>Move or recreate the instance in a healthier zone
Expected: Instance [<INSTANCE>] moved/recreated in the alternate zone
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 operations list --filter='targetLink~<INSTANCE>' --format='value(error)'Read the exact error before acting
gcloud compute regions describe <REGION> --format='json(quotas)'Check project quota is not the blocker
gcloud compute instances move <INSTANCE> --zone=<ZONE> --destination-zone=<ALT_ZONE>Move to a zone with available capacity
gcloud compute instances start <INSTANCE> --zone=<ALT_ZONE>Start the instance in the alternate zone
Prevention
- Run stateless workloads in regional MIGs across at least two zones.
- Set MIG autohealing so capacity failures trigger replacement automatically.
- Request regional CPU quota with headroom before launch events.
- Watch ZONE_RESOURCE_POOL_EXHAUSTED and GCE_INTERNAL_ERROR in Cloud Monitoring metrics.
Related runbooks
Same stack, same failure family — worth a skim.
Commands marked READ CHANGE DESTRUCTIVE — never run DESTRUCTIVE commands against production data you cannot restore. Copy → verify → execute.