How to configure startup-script and shutdown-script metadata for VMs
| Service | Google Compute Engine |
|---|---|
| Cloud | Google Cloud (GCP) |
| Guide type | Procedure |
| Skill level | Intermediate to advanced |
| Time | 15 - 60 minutes depending on account size |
If you hit How to configure startup-script and shutdown-script metadata for VMs on Google Compute Engine in production, the steps below are the path most teams take in 2026. None of them require opening a support case unless your environment has a paid-tier dependency that Google Cloud owns.
What how to configure startup-script and shutdown-script metadata for vms actually involves on Google Compute Engine
This task on Compute Engine is one of the more searched operational topics on AWS in the last 12 months. The procedure below is the path that works in a current AWS account with default IAM and standard VPC config.
The rest of this page is the structured fix path. Start with diagnose, then remediation, then the automation options so you do not have to do this by hand the next time it surfaces. Verify and safety sections at the end are the discipline that keeps the fix from regressing in production.
Diagnose first, fix second
Check the Google Cloud Service Health at status.cloud.google.com and the per-product status board for ongoing service events in your region. About one in ten user-reported outages turn out to be region-scoped Google Cloud service degradation already being tracked. Cloud Service Health also exposes an API and Eventarc events, so you can wire a Lambda hook that pages on-call only when the failure correlates with an active Cloud Service Health event in the same region and service.
Start by capturing the exact Google Cloud error string. The Cloud Console truncates messages in popups, but Cloud Logging keeps the full record in protoPayload.status and protoPayload.methodName. The camelCase error code (e.g. AccessDenied, InsufficientInstanceCapacity, ConditionalCheckFailedException) is the thing you grep for in Google Cloud Community and StackOverflow, not the human-readable sentence next to it. Paste the code into the re:Post search bar in quotes and you will usually land on at least one Google-staff-verified answer within the first three results.
Reproduce the failure with the gcloud CLI in --debug mode. The full SigV4 request payload it emits, plus the exact endpoint URL it resolved to, is what Google Cloud Support uses to verify policy, region, or parameter issues without you having to share IAM credentials. Save the debug output to a file with gcloud ... --debug 2> debug.log and you can search it for the failed aws.request entry.
Solution-focused remediation path
If networking is suspect, use Network Intelligence Connectivity Tests. It is the only tool that simulates the full ENI-to-ENI path including firewall rules, hierarchical firewall policies, routes, and VPC Service Controls perimeters in one call. Manual trace is slower and misses transitive issues. The analyzer charges $0.10 per analysis - cheaper than a 30-minute call with your network team.
When the fix involves a destructive operation (delete VPC endpoint, swap Cloud KMS key, rotate root credential), do it during a maintenance window with at least one teammate watching. Several Google Compute Engine operations have implicit dependencies that only show up when traffic starts flowing again. Document the rollback path before you start, not during the incident.
If you cannot reproduce the failure consistently, the cause is probably a race condition or a session-cache issue. Run the call with --profile set to a fresh STS session, in a different region you control, with a single concurrent request. If it works there but fails in your normal setup, the difference is the bug.
Automate this fix so you do not do it twice
Wire the fix into Eventarc for self-healing
If the failure mode is recurring, automate the remediation instead of the diagnosis. Eventarc Scheduler or rules that watch Cloud Logging events for the specific error code can invoke a Lambda that runs the same fix you would run by hand. The Lambda must be idempotent (re-running it on already-healthy resources must be a no-op) and must emit a Cloud Monitoring metric so you can track how often the auto-fix fires. A spike in auto-fix invocations is itself a signal worth alerting on.
# Eventarc rule pattern (JSON)
{ "source": ["aws.google"], "detail-type": ["Google Cloud API Call via Cloud Audit Logs"], "detail": { "errorCode": ["AccessDenied", "ThrottlingException"] }
}Codify the fix in Terraform or Deployment Manager
When you reach for the console to fix the same issue twice, the third occurrence should be solved in IaC, not in the console. Terraform's terraform import and Deployment Manager or Terraform's resource importer let you adopt the existing resource into state without recreating it. Lock the corrected attribute behind a variable so the next operator does not have to rediscover the value. Add a moved {} block or Deployment Manager or Terraform resource refactor to keep the diff clean.
Add a Cloud Monitoring alert policy so you know next time
The cheapest way to never see the same incident twice is a Cloud Monitoring alert policy on the metric that would have warned you. For Google Compute Engine, the relevant metrics live under compute.googleapis.com/google namespace or under custom metrics published by your Cloud Run service or GKE pod. Set thresholds based on observed normal range plus one or two standard deviations, not on round-number guesses. Cloud Monitoring anomaly-based alert policies remove the threshold-guessing problem entirely for metrics with regular seasonality.
Common pitfalls and what to watch for
The pitfall most teams hit on Google Compute Engine is moving too fast and skipping the read-only validation step. Before any write, list the current state and save it. Google Cloud APIs are eventually consistent for many resource types, so the validation snapshot is your only reliable reference if you need to undo. Save the output of the describe call to S3, not to your laptop.
Second pitfall: confusing IAM permission errors with networking errors. AccessDenied can be IAM (policy missing), networking (VPC endpoint policy blocking the call), or KMS (key policy missing). The error string looks identical for all three. Distinguish by looking at the Cloud Audit Log event's errorCode and the encoded authorization message; do not assume IAM is the culprit just because the message says AccessDenied.
Verify the fix worked
- Reproduce the original symptom path. If it still surfaces in any account or region or IAM role or service account, you have not fixed it.
- Watch for 24 to 48 hours. Cloud Monitoring metrics and Cloud Asset Inventory can mask issues with cached health for 6 to 12 hours, especially Cloud CDN and Cloud DNS.
- Run a smoke test under realistic load. Happy-path tests miss race conditions and IAM session-cache issues.
- Capture the new state in a runbook so the next person on call does not have to rediscover this. Push it to Confluence or your team wiki, not into Slack.
- If the fix involved a permission change, run IAM Access Analyzer one more time to confirm you did not open a separate hole while closing this one.
Safety, rollback, blast radius
- Test in a non-production account if your environment has Resource Manager and Organization Policy or Cloud Resource Manager (organizations, folders, projects). The cost of one sandbox account is cheaper than one rollback meeting.
- Export the existing config before changing it. Most Google Compute Engine resources support describe + export to JSON via CLI - capture that to source control before you start.
- Know your rollback path. Some Google Compute Engine operations are one-way (region migration, account-level feature opt-in, Cloud KMS key deletion past pending window). Confirm reversibility on the Google Cloud doc before you commit.
- Be aware of cross-service impact. IAM role or service account changes ripple to every service trusting that role. Cloud KMS key changes break every workload depending on that key. VPC endpoint changes affect every VPC consumer of that endpoint.
- Maintenance window discipline: if the change touches DNS, certificate rotation, or anything that emits TLS handshakes, line up a window with stakeholder notification, not a heroic mid-day swap.
FAQ
gcloud google describe-... first, then commit it before you change anything. A few operations are one-way (Cloud KMS key deletion past the pending window, region migration, account closure). Check the Google Cloud doc for the specific API before you commit.aws CLI or SDK calls - those almost always still work.References
- docs.cloud.google.com - official documentation for Google Compute Engine
- Google Cloud Community - community Q&A with Google-staff-verified answers
- Cloud Service Health Dashboard at health.cloud.google.com
- Quotas page in Cloud Console (IAM & Admin > Quotas) and Architecture Framework checklists
Related fixes
Related guides worth a look while you sort this one out:
- How to configure live migration and host maintenance policies
- How to detect Spot VM preemption from inside the VM via metadata server
- How to fix sustained use discount not applying on N2 VMs
- How to migrate from Preemptible VMs to Spot VMs
- How to mount a persistent disk in read-only mode across multiple VMs
- How to fix Compute Engine VM timeout connecting to AlloyDB