Google Cloud Cheatsheet

IAM

Use this Google Cloud reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.

Core Concepts

TermWhat it means
PrincipalWho: user, service account, group, domain, allUsers
RoleCollection of permissions (e.g., roles/storage.objectAdmin)
PermissionSingle action (e.g., storage.objects.create)
PolicyBinding of principals → roles on a resource
ConditionOptional CEL expression to restrict when a binding applies

Role types: - Basicroles/viewer, roles/editor, roles/owner (broad, avoid in prod) - Predefined — Google-managed per-service roles (roles/run.invoker, roles/cloudsql.client) - Custom — Your own combination of permissions

Viewing Policies

# Project-level IAM policy
gcloud projects get-iam-policy my-project

# Folder-level
gcloud resource-manager folders get-iam-policy FOLDER_ID

# Org-level
gcloud organizations get-iam-policy ORG_ID

# Resource-level (e.g., bucket)
gcloud storage buckets get-iam-policy gs://my-bucket

# Filter for a specific member
gcloud projects get-iam-policy my-project \
  --flatten="bindings[].members" \
  --filter="bindings.members:alice@example.com" \
  --format="table(bindings.role)"

Granting & Revoking

# Grant a role to a user
gcloud projects add-iam-policy-binding my-project \
  --member="user:alice@example.com" \
  --role="roles/editor"

# Grant to a group
gcloud projects add-iam-policy-binding my-project \
  --member="group:devs@example.com" \
  --role="roles/viewer"

# Grant to a service account
gcloud projects add-iam-policy-binding my-project \
  --member="serviceAccount:sa@my-project.iam.gserviceaccount.com" \
  --role="roles/storage.objectAdmin"

# Grant to allUsers (public!)
gcloud projects add-iam-policy-binding my-project \
  --member="allUsers" \
  --role="roles/run.invoker"

# Revoke a role
gcloud projects remove-iam-policy-binding my-project \
  --member="user:alice@example.com" \
  --role="roles/editor"

Service Accounts

# Create a service account
gcloud iam service-accounts create my-sa \
  --display-name="My App SA" \
  --description="Used by the backend service"

# List service accounts
gcloud iam service-accounts list

# Describe
gcloud iam service-accounts describe my-sa@my-project.iam.gserviceaccount.com

# Create a JSON key (avoid when possible — use Workload Identity instead)
gcloud iam service-accounts keys create key.json \
  --iam-account=my-sa@my-project.iam.gserviceaccount.com

# List keys
gcloud iam service-accounts keys list \
  --iam-account=my-sa@my-project.iam.gserviceaccount.com

# Delete a key
gcloud iam service-accounts keys delete KEY_ID \
  --iam-account=my-sa@my-project.iam.gserviceaccount.com

# Disable / enable a service account
gcloud iam service-accounts disable my-sa@my-project.iam.gserviceaccount.com
gcloud iam service-accounts enable my-sa@my-project.iam.gserviceaccount.com

# Delete a service account
gcloud iam service-accounts delete my-sa@my-project.iam.gserviceaccount.com

Service Account Impersonation

# Run a gcloud command as a service account
gcloud storage ls --impersonate-service-account=my-sa@my-project.iam.gserviceaccount.com

# Grant user permission to impersonate a SA
gcloud iam service-accounts add-iam-policy-binding my-sa@my-project.iam.gserviceaccount.com \
  --member="user:alice@example.com" \
  --role="roles/iam.serviceAccountTokenCreator"

Custom Roles

# List available permissions for a service
gcloud iam list-testable-permissions //cloudresourcemanager.googleapis.com/projects/my-project

# Create a custom role from a YAML file
cat custom-role.yaml
title: "Custom Storage Reader"
description: "Read-only on specific bucket objects"
stage: "GA"
includedPermissions:
  - storage.objects.get
  - storage.objects.list
gcloud iam roles create customStorageReader \
  --project=my-project \
  --file=custom-role.yaml

# Update a custom role
gcloud iam roles update customStorageReader \
  --project=my-project \
  --add-permissions=storage.buckets.get

# List custom roles
gcloud iam roles list --project=my-project

Conditional Bindings (CEL)

# Grant role only during business hours
gcloud projects add-iam-policy-binding my-project \
  --member="user:alice@example.com" \
  --role="roles/editor" \
  --condition='expression=request.time.getHours("America/New_York") >= 9 && request.time.getHours("America/New_York") < 17,title=BusinessHoursOnly'

# Grant role only for a specific resource
gcloud projects add-iam-policy-binding my-project \
  --member="user:alice@example.com" \
  --role="roles/storage.objectAdmin" \
  --condition='expression=resource.name.startsWith("projects/_/buckets/my-bucket"),title=BucketScoped'

Workload Identity (keyless auth — preferred over key files)

# GKE: bind a Kubernetes service account to a GCP service account
gcloud iam service-accounts add-iam-policy-binding my-sa@my-project.iam.gserviceaccount.com \
  --role="roles/iam.workloadIdentityUser" \
  --member="serviceAccount:my-project.svc.id.goog[namespace/ksa-name]"

Workload Identity Federation (external OIDC, e.g. GitHub Actions)

# 1. Create a workload identity pool
gcloud iam workload-identity-pools create github-pool \
  --location=global \
  --display-name="GitHub Actions"

# 2. Add GitHub's OIDC issuer as a provider (attribute condition is required)
gcloud iam workload-identity-pools providers create-oidc github-provider \
  --location=global \
  --workload-identity-pool=github-pool \
  --issuer-uri="https://token.actions.githubusercontent.com" \
  --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository" \
  --attribute-condition="assertion.repository_owner == 'my-org'"

# 3. Let one repo impersonate the service account (use the project NUMBER)
gcloud iam service-accounts add-iam-policy-binding my-sa@my-project.iam.gserviceaccount.com \
  --role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/github-pool/attribute.repository/my-org/my-repo"

# 4. In the workflow, authenticate with google-github-actions/auth:
#    workload_identity_provider: projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/github-pool/providers/github-provider
#    service_account: my-sa@my-project.iam.gserviceaccount.com

Commonly Used Predefined Roles

RoleAccess level
roles/viewerRead-only across project
roles/editorRead/write (no IAM)
roles/ownerFull access including IAM
roles/iam.securityAdminManage IAM policies
roles/compute.instanceAdmin.v1Full VM management
roles/run.invokerCall Cloud Run services
roles/cloudsql.clientConnect to Cloud SQL
roles/storage.objectAdminFull object access
roles/storage.objectViewerRead-only objects
roles/bigquery.dataEditorBQ table read/write
roles/secretmanager.secretAccessorRead secrets
roles/logging.logWriterWrite log entries

IAM Policy File Format

{
  "bindings": [
    {
      "role": "roles/storage.objectViewer",
      "members": [
        "user:alice@example.com",
        "serviceAccount:sa@proj.iam.gserviceaccount.com"
      ]
    }
  ],
  "etag": "BwXXXXX",
  "version": 1
}
# Apply a policy file
gcloud projects set-iam-policy my-project policy.json