GCP for DevOps — IAM Roles
IAM Roles
A role is a collection of permissions. Instead of granting individual permissions to users, you grant roles. GCP offers three categories of roles: basic, predefined, and custom.
Three Types of Roles
┌─────────────────────────────────────────────────────┐
│ IAM Roles │
├─────────────┬─────────────────┬─────────────────────┤
│ Basic │ Predefined │ Custom │
│ (Primitive) │ (Google-managed)│ (User-defined) │
├─────────────┼─────────────────┼─────────────────────┤
│ Owner │ roles/compute. │ roles/my-custom- │
│ Editor │ instanceAdmin │ role │
│ Viewer │ roles/storage. │ │
│ │ objectViewer │ You pick exactly │
│ Thousands │ │ which permissions │
│ of perms │ Scoped to one │ to include │
│ │ service │ │
└─────────────┴─────────────────┴─────────────────────┘
Basic Roles
Basic roles existed before Cloud IAM and grant broad access across all services in a project.
| Role | Permissions | Use Case |
|---|---|---|
roles/viewer |
Read-only access to all resources | Auditors, read-only users |
roles/editor |
Read + write access to most resources | Avoid in production |
roles/owner |
Full control + IAM management + billing | Project administrators only |
roles/browser |
List projects and folders only | Org-level navigation |
⚠️ DevOps Best Practice: Never use
roles/editororroles/ownerfor service accounts or automation. Use predefined or custom roles with least-privilege access.
Predefined Roles
Google maintains over 1,000 predefined roles scoped to individual services. These follow the pattern roles/<service>.<roleName>.
# List all predefined roles
$ gcloud iam roles list --filter="name:roles/compute" --format="table(name,title)"
NAME TITLE
roles/compute.admin Compute Admin
roles/compute.instanceAdmin Compute Instance Admin (beta)
roles/compute.instanceAdmin.v1 Compute Instance Admin (v1)
roles/compute.networkAdmin Compute Network Admin
roles/compute.networkViewer Compute Network Viewer
roles/compute.osAdminLogin Compute OS Admin Login
roles/compute.osLogin Compute OS Login
roles/compute.securityAdmin Compute Security Admin
roles/compute.storageAdmin Compute Storage Admin
roles/compute.viewer Compute Viewer
# View permissions in a specific role
$ gcloud iam roles describe roles/compute.instanceAdmin.v1
includedPermissions:
- compute.acceleratorTypes.get
- compute.acceleratorTypes.list
- compute.addresses.create
- compute.addresses.delete
- compute.addresses.get
- compute.addresses.list
- compute.addresses.use
- compute.instances.create
- compute.instances.delete
- compute.instances.get
- compute.instances.list
- compute.instances.start
- compute.instances.stop
... (many more)
title: Compute Instance Admin (v1)
Commonly Used Predefined Roles for DevOps
| Role | Description |
|---|---|
roles/compute.instanceAdmin.v1 |
Create, modify, delete VMs |
roles/container.admin |
Full access to GKE clusters |
roles/storage.objectAdmin |
Full control over GCS objects |
roles/cloudbuild.builds.builder |
Run and cancel builds |
roles/run.admin |
Full access to Cloud Run services |
roles/logging.admin |
Full access to Logging |
roles/monitoring.admin |
Full access to Cloud Monitoring |
roles/iam.serviceAccountUser |
Impersonate a service account |
Custom Roles
When predefined roles are too broad, create a custom role with only the permissions you need.
# Create a custom role at the project level
$ gcloud iam roles create devopsDeployer \
--project=my-project \
--title="DevOps Deployer" \
--description="Deploy applications to GKE and Cloud Run" \
--permissions="container.deployments.create,container.deployments.update,container.deployments.get,run.services.create,run.services.update,run.services.get" \
--stage=GA
Created role [devopsDeployer].
description: Deploy applications to GKE and Cloud Run
includedPermissions:
- container.deployments.create
- container.deployments.get
- container.deployments.update
- run.services.create
- run.services.get
- run.services.update
name: projects/my-project/roles/devopsDeployer
stage: GA
title: DevOps Deployer
# Create a custom role from a YAML file
$ cat deployer-role.yaml
title: "DevOps Deployer"
description: "Deploy applications to GKE and Cloud Run"
stage: "GA"
includedPermissions:
- container.deployments.create
- container.deployments.update
- container.deployments.get
- run.services.create
- run.services.update
- run.services.get
$ gcloud iam roles create devopsDeployer \
--project=my-project \
--file=deployer-role.yaml
# Update a custom role — add a permission
$ gcloud iam roles update devopsDeployer \
--project=my-project \
--add-permissions="run.services.delete"
# List custom roles in a project
$ gcloud iam roles list --project=my-project --format="table(name,title)"
NAME TITLE
projects/my-project/roles/devopsDeployer DevOps Deployer
Role Recommendations
IAM Recommender analyses your actual permission usage and suggests least-privilege role replacements.
# List IAM recommendations for a project
$ gcloud recommender recommendations list \
--project=my-project \
--recommender=google.iam.policy.Recommender \
--location=global \
--format="table(content.operationGroups[0].operations[0].value.bindings[0].role,priority,stateInfo.state)"
ROLE PRIORITY STATE
roles/storage.objectViewer P2 ACTIVE
roles/compute.viewer P2 ACTIVE
Choosing the Right Role
┌─────────────────────────┐
│ Need access to a GCP │
│ resource? │
└────────────┬────────────┘
│
┌─────────▼──────────┐
│ Is there a │
│ predefined role │──── Yes ──→ Use it
│ that fits? │
└─────────┬──────────┘
│ No
┌─────────▼──────────┐
│ Can you combine │
│ multiple predefined │──── Yes ──→ Use multiple
│ roles? │ roles
└─────────┬──────────┘
│ No
┌─────────▼──────────┐
│ Create a custom │
│ role with only the │
│ permissions needed │
└────────────────────┘
Common Mistakes
| Mistake | Why It’s Wrong | Fix |
|---|---|---|
Using roles/editor for CI/CD |
Grants write to all services | Use predefined per-service roles |
| Granting roles at org level | Inherited by all projects | Grant at project or resource level |
| Not reviewing custom roles | Permissions may become stale | Use IAM Recommender |
| Ignoring role conditions | Roles apply 24/7 by default | Add time or resource conditions |
Quick Reference
| Command | Description |
|---|---|
gcloud iam roles list |
List all predefined roles |
gcloud iam roles describe ROLE |
View role permissions |
gcloud iam roles create NAME --project=PROJ --file=FILE |
Create custom role |
gcloud iam roles update NAME --project=PROJ --add-permissions=PERMS |
Add permissions |
gcloud iam roles delete NAME --project=PROJ |
Delete custom role |
gcloud iam roles undelete NAME --project=PROJ |
Restore deleted role (within 7 days) |
Next → Service Accounts