Back to Skills
    🦞

    gcloud

    Manage Google Cloud Platform resources via gcloud.

    By @jortega0033
    View on GitHub
    SKILL.md
    ---
    name: gcloud
    description: Manage Google Cloud Platform resources via gcloud CLI. Use for Compute Engine VMs, Cloud Run services, Firebase Hosting, Cloud Storage, and project management. Covers deployment, monitoring, logs, and SSH access.
    ---
    
    # Google Cloud Platform Skill
    
    Manage GCP resources using `gcloud`, `gsutil`, and `firebase` CLIs.
    
    ## Installation
    
    ### gcloud CLI (one-time setup)
    
    ```bash
    # Download and extract
    cd ~ && curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-linux-x86_64.tar.gz
    tar -xzf google-cloud-cli-linux-x86_64.tar.gz
    
    # Install (adds to PATH via .bashrc)
    ./google-cloud-sdk/install.sh --quiet --path-update true
    
    # Reload shell or source
    source ~/.bashrc
    
    # Authenticate
    gcloud auth login
    ```
    
    ### Firebase CLI
    
    ```bash
    npm install -g firebase-tools
    firebase login
    ```
    
    ## Quick Reference
    
    ### Authentication & Config
    
    ```bash
    # List authenticated accounts
    gcloud auth list
    
    # Switch active account
    gcloud config set account EMAIL
    
    # List projects
    gcloud projects list
    
    # Set default project
    gcloud config set project PROJECT_ID
    
    # View current config
    gcloud config list
    ```
    
    ---
    
    ## Compute Engine (VMs)
    
    ### List Instances
    
    ```bash
    # All instances across projects
    gcloud compute instances list --project PROJECT_ID
    
    # With specific fields
    gcloud compute instances list --project PROJECT_ID \
      --format="table(name,zone,status,networkInterfaces[0].accessConfigs[0].natIP)"
    ```
    
    ### Start/Stop/Restart
    
    ```bash
    gcloud compute instances start INSTANCE_NAME --zone ZONE --project PROJECT_ID
    gcloud compute instances stop INSTANCE_NAME --zone ZONE --project PROJECT_ID
    gcloud compute instances reset INSTANCE_NAME --zone ZONE --project PROJECT_ID
    ```
    
    ### SSH Access
    
    ```bash
    # Interactive SSH
    gcloud compute ssh INSTANCE_NAME --zone ZONE --project PROJECT_ID
    
    # Run command remotely
    gcloud compute ssh INSTANCE_NAME --zone ZONE --project PROJECT_ID --command "uptime"
    
    # With tunneling (e.g., for local port forwarding)
    gcloud compute ssh INSTANCE_NAME --zone ZONE --project PROJECT_ID -- -L 8080:localhost:8080
    ```
    
    ### View Logs
    
    ```bash
    # Serial port output (boot logs)
    gcloud compute instances get-serial-port-output INSTANCE_NAME --zone ZONE --project PROJECT_ID
    
    # Tail logs via SSH
    gcloud compute ssh INSTANCE_NAME --zone ZONE --project PROJECT_ID --command "journalctl -f"
    ```
    
    ---
    
    ## Cloud Run
    
    ### List Services
    
    ```bash
    # List all services in a region
    gcloud run services list --region REGION --project PROJECT_ID
    
    # All regions
    gcloud run services list --project PROJECT_ID
    ```
    
    ### Deploy
    
    ```bash
    # Deploy from source (builds container automatically)
    gcloud run deploy SERVICE_NAME \
      --source . \
      --region REGION \
      --project PROJECT_ID \
      --allow-unauthenticated
    
    # Deploy existing container image
    gcloud run deploy SERVICE_NAME \
      --image gcr.io/PROJECT_ID/IMAGE:TAG \
      --region REGION \
      --project PROJECT_ID
    ```
    
    ### View Service Details
    
    ```bash
    gcloud run services describe SERVICE_NAME --region REGION --project PROJECT_ID
    ```
    
    ### View Logs
    
    ```bash
    # Stream logs
    gcloud run services logs read SERVICE_NAME --region REGION --project PROJECT_ID --limit 50
    
    # Or use Cloud Logging
    gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME" \
      --project PROJECT_ID --limit 20 --format="table(timestamp,textPayload)"
    ```
    
    ### Update Environment Variables
    
    ```bash
    gcloud run services update SERVICE_NAME \
      --region REGION \
      --project PROJECT_ID \
      --set-env-vars "KEY1=value1,KEY2=value2"
    ```
    
    ### Traffic Management
    
    ```bash
    # Route 100% traffic to latest
    gcloud run services update-traffic SERVICE_NAME --to-latest --region REGION --project PROJECT_ID
    
    # Split traffic (canary)
    gcloud run services update-traffic SERVICE_NAME \
      --to-revisions=REVISION1=90,REVISION2=10 \
      --region REGION --project PROJECT_ID
    ```
    
    ---
    
    ## Firebase Hosting
    
    ### List Projects
    
    ```bash
    firebase projects:list
    ```
    
    ### Deploy
    
    ```bash
    # Deploy everything (hosting + functions + rules)
    firebase deploy --project PROJECT_ID
    
    # Hosting only
    firebase deploy --only hosting --project PROJECT_ID
    
    # Specific site (multi-site setup)
    firebase deploy --only hosting:SITE_NAME --project PROJECT_ID
    ```
    
    ### Preview Channels
    
    ```bash
    # Create preview channel
    firebase hosting:channel:deploy CHANNEL_NAME --project PROJECT_ID
    
    # List channels
    firebase hosting:channel:list --project PROJECT_ID
    
    # Delete channel
    firebase hosting:channel:delete CHANNEL_NAME --project PROJECT_ID
    ```
    
    ### Rollback
    
    ```bash
    # List recent deploys
    firebase hosting:releases:list --project PROJECT_ID
    
    # Rollback to specific version
    firebase hosting:rollback --project PROJECT_ID
    ```
    
    ---
    
    ## Cloud Storage (gsutil)
    
    ```bash
    # List buckets
    gsutil ls
    
    # List contents
    gsutil ls gs://BUCKET_NAME/
    
    # Copy file
    gsutil cp LOCAL_FILE gs://BUCKET_NAME/path/
    gsutil cp gs://BUCKET_NAME/path/file LOCAL_PATH
    
    # Sync directory
    gsutil -m rsync -r LOCAL_DIR gs://BUCKET_NAME/path/
    
    # Make public
    gsutil iam ch allUsers:objectViewer gs://BUCKET_NAME
    ```
    
    ---
    
    ## Logs & Monitoring
    
    ### Cloud Logging
    
    ```bash
    # Read recent logs
    gcloud logging read "resource.type=gce_instance" --project PROJECT_ID --limit 20
    
    # Filter by severity
    gcloud logging read "severity>=ERROR" --project PROJECT_ID --limit 20
    
    # Specific resource
    gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=my-service" \
      --project PROJECT_ID --limit 20
    ```
    
    ### Monitoring Metrics
    
    ```bash
    # List available metrics
    gcloud monitoring metrics list --project PROJECT_ID | head -50
    
    # Describe metric
    gcloud monitoring metrics-scopes describe projects/PROJECT_ID
    ```
    
    ---
    
    ## Billing & Cost Monitoring
    
    ### View Current Costs
    
    ```bash
    # List billing accounts
    gcloud billing accounts list
    
    # Get billing account linked to project
    gcloud billing projects describe PROJECT_ID
    
    # View cost breakdown (requires billing export to BigQuery or use console)
    # Quick estimate via APIs enabled:
    gcloud services list --enabled --project PROJECT_ID
    ```
    
    ### Set Budget Alerts
    
    ```bash
    # Create budget (via gcloud beta)
    gcloud billing budgets create \
      --billing-account=BILLING_ACCOUNT_ID \
      --display-name="Monthly Budget" \
      --budget-amount=50EUR \
      --threshold-rule=percent=50 \
      --threshold-rule=percent=90 \
      --threshold-rule=percent=100
    
    # List budgets
    gcloud billing budgets list --billing-account=BILLING_ACCOUNT_ID
    
    # Describe budget
    gcloud billing budgets describe BUDGET_ID --billing-account=BILLING_ACCOUNT_ID
    ```
    
    ### Cost-Saving Tips
    
    ```bash
    # Stop unused VMs (saves $$)
    gcloud compute instances stop INSTANCE_NAME --zone ZONE --project PROJECT_ID
    
    # Schedule auto-start/stop (use Cloud Scheduler + Cloud Functions or cron)
    
    # Check for idle resources
    gcloud recommender recommendations list \
      --project=PROJECT_ID \
      --location=global \
      --recommender=google.compute.instance.IdleResourceRecommender
    ```
    
    ---
    
    ## Secret Manager
    
    ### Create & Manage Secrets
    
    ```bash
    # Enable API
    gcloud services enable secretmanager.googleapis.com --project PROJECT_ID
    
    # Create a secret
    echo -n "my-secret-value" | gcloud secrets create SECRET_NAME \
      --data-file=- \
      --project PROJECT_ID
    
    # Or from file
    gcloud secrets create SECRET_NAME --data-file=./secret.txt --project PROJECT_ID
    ```
    
    ### Access Secrets
    
    ```bash
    # Get latest version
    gcloud secrets versions access latest --secret=SECRET_NAME --project PROJECT_ID
    
    # Get specific version
    gcloud secrets versions access 1 --secret=SECRET_NAME --project PROJECT_ID
    
    # List all secrets
    gcloud secrets list --project PROJECT_ID
    
    # List versions of a secret
    gcloud secrets versions list SECRET_NAME --project PROJECT_ID
    ```
    
    ### Update Secrets
    
    ```bash
    # Add new version
    echo -n "new-value" | gcloud secrets versions add SECRET_NAME --data-file=- --project PROJECT_ID
    
    # Disable old version
    gcloud secrets versions disable VERSION_ID --secret=SECRET_NAME --project PROJECT_ID
    
    # Delete version (permanent!)
    gcloud secrets versions destroy VERSION_ID --secret=SECRET_NAME --project PROJECT_ID
    ```
    
    ### Use in Cloud Run
    
    ```bash
    # Deploy with secret as env var
    gcloud run deploy SERVICE_NAME \
      --image IMAGE \
      --region REGION \
      --project PROJECT_ID \
      --set-secrets="ENV_VAR_NAME=SECRET_NAME:latest"
    
    # Mount as file
    gcloud run deploy SERVICE_NAME \
      --image IMAGE \
      --region REGION \
      --project PROJECT_ID \
      --set-secrets="/path/to/secret=SECRET_NAME:latest"
    ```
    
    ---
    
    ## Artifact Registry (Container Images)
    
    ### Setup
    
    ```bash
    # Enable API
    gcloud services enable artifactregistry.googleapis.com --project PROJECT_ID
    
    # Create Docker repository
    gcloud artifacts repositories create REPO_NAME \
      --repository-format=docker \
      --location=REGION \
      --project PROJECT_ID \
      --description="Docker images"
    ```
    
    ### Configure Docker Auth
    
    ```bash
    # Configure Docker to use gcloud credentials
    gcloud auth configure-docker REGION-docker.pkg.dev
    ```
    
    ### Build & Push Images
    
    ```bash
    # Build with Cloud Build (no local Docker needed)
    gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE:TAG
    
    # Or with local Docker
    docker build -t REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE:TAG .
    docker push REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE:TAG
    ```
    
    ### List & Manage Images
    
    ```bash
    # List images
    gcloud artifacts docker images list REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME
    
    # List tags for an image
    gcloud artifacts docker tags list REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE
    
    # Delete image
    gcloud artifacts docker images delete REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE:TAG
    ```
    
    ---
    
    ## Cloud SQL (Databases)
    
    ### Create Instance
    
    ```bash
    # Enable API
    gcloud services enable sqladmin.googleapis.com --project PROJECT_ID
    
    # Create PostgreSQL instance
    gcloud sql instances create INSTANCE_NAME \
      --database-version=POSTGRES_15 \
      --tier=db-f1-micro \
      --region=REGION \
      --project PROJECT_ID
    
    # Create MySQL instance
    gcloud sql instances create INSTANCE_NAME \
      --database-version=MYSQL_8_0 \
      --tier=db-f
    
    ... (truncated)