# for cli usage
gcloud auth login
# for sdk/library usage (e.g. python google-cloud or terraform/tofu)
gcloud auth application-default login
set project
# for cli usage
gcloud config set project my-project-id
# for sdk/library usage (e.g. python google-cloud or terraform/tofu)
gcloud auth application-default set-quota-project my-project-id
# verify
gcloud config get-value project
cat ~/.config/gcloud/application_default_credentials.json
list buckets
gsutil ls
# or newer, unified version
gcloud storage ls
# List all roles
gcloud iam roles list
# Describe a role
gcloud iam roles describe roles/storage.admin
# List predefined roles for a service
gcloud iam roles list --filter="name:roles/storage.*"
Organization
└─ Folder
└─ Project
└─ Resource (bucket, instance, etc.)
gcloud organizations ...
gcloud resource-manager folders ...
gcloud projects ...
gcloud <service> ... # e.g., compute, iam, storage ...
WHO (Principal) + WHAT (Role) + WHERE (Resource)
# User
user:[email protected]
# Service Account (like AWS IAM role + Azure Managed Identity)
serviceAccount:[email protected]
# Group
group:[email protected]
# Domain
domain:enbw.com
# All authenticated users
allAuthenticatedUsers
# Public
allUsers
user accounts vs service accounts
user accounts
user:[email protected]`service accounts
serviceAccount:my-app@PROJECT_ID.iam.gserviceaccount.comBasic Roles (legacy, avoid in production)
roles/viewer - Read-only access roles/editor - Read-write access roles/owner - Full control
Predefined Roles (use these!)
roles/storage.admin - Full control of Cloud Storage roles/compute.instanceAdmin.v1 - Manage VM instances roles/iam.serviceAccountUser - Use service account
Custom Roles (for specific needs)
Define your own permissions
IAM policies can be set at multiple levels (inheritance flows down):
Organization
└─ Folder
└─ Project
└─ Resource (bucket, instance, etc.)
Service accounts are both:
# Grant permission for SA1 to impersonate SA2
gcloud iam service-accounts add-iam-policy-binding [email protected] \
--member="serviceAccount:[email protected]" \
--role="roles/iam.serviceAccountTokenCreator"
# Now workload using SA1 can impersonate SA2
gcloud storage ls --impersonate-service-account=[email protected]
e.g. external access to gcp
# Allow AWS IAM role to impersonate GCP service account
gcloud iam service-accounts add-iam-policy-binding my-app@PROJECT_ID.iam.gserviceaccount.com \
--role="roles/iam.workloadIdentityUser" \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/arn:aws:sts::AWS_ACCOUNT:assumed-role/ROLE_NAME"