Setup GCP untuk connect CLI dengan Service Account Impersonation

Introduction

Saat belajar GCP, jangan langsung pakai akun Google pribadi untuk provisioning resource. Pakai pola service account impersonation — akun kita cuma untuk auth, semua aksi Terraform/gcloud lewat service account yang lebih strict hak
aksesnya.

Ini setup yang saya pakai untuk belajar Terraform + GCP.


Prepare

Taruh ini di shell profile (~/.zshrc) atau export manual tiap sesi:

export PROJECT_ID="project-123456-7890-4555-333"
export GOOGLE_IMPERSONATE_SERVICE_ACCOUNT="learn-devops-engineer@${PROJECT_ID}.iam.gserviceaccount.com"

Step 1 — Buat Service Account (GCP Console)

  1. Buka https://console.cloud.google.com/ → pastikan project yang benar.
  2. IAM & Admin → Service Accounts → + Create Service Account.
  3. Isi:
    • Service account name: learn-devops-engineer
    • Service account ID: auto, samakan dengan email SA.
  4. Grant this service account access to project → pilih Owner (untuk belajar; production pakai least-privilege).
  5. Klik Done.

Catat email SA — harusnya: learn-devops-engineer@project-project-123456-7890-4555-333.iam.gserviceaccount.com


Step 2 — Izinkan Akun Pribadi untuk Impersonate SA

Masih di IAM & Admin → IAM → + Grant Access:

  • New principals: isi email Google pribadi kita (mis. you@gmail.com).
  • Assign roles (centang 2):
    • Service Account User — roles/iam.serviceAccountUser
    • Service Account Token Creator — roles/iam.serviceAccountTokenCreator
  • Klik Save.

⚠ Tanpa 2 role ini, gcloud auth application-default login --impersonate-service-account=… akan return Permission denied.


Step 3 — Aktifkan API Wajib

APIs & Services → Library, enable:

  • IAM Service Account Credentials API
  • Cloud Resource Manager API
  • Compute Engine API (kalau nanti pakai VM/GKE)
  • Kubernetes Engine API (kalau nanti GKE)

Step 4 — Login dari Laptop

# (1) Login akun pribadi — popup browser, sekali per mesin
gcloud auth login

# (2) Set project aktif
gcloud config set project "$PROJECT_ID"

# (3) ADC dengan impersonation — popup consent kedua
gcloud auth application-default login \
  --impersonate-service-account="$GOOGLE_IMPERSONATE_SERVICE_ACCOUNT"

Browser kedua akan terbuka dengan pesan: “Google Cloud Platform wants to access your Google Account via service account learn-develops-engineer@…” → klik Allow.


Step 5 — Verifikasi

# Project aktif
gcloud config get-value project
# → project-123456-7890-4555-333

# Akun login user-level
gcloud auth list
# → * you@gmail.com   (active)

# Token ADC via impersonation — INI yang paling penting
gcloud auth application-default print-access-token | head -c 50
# → eyta...  (kalau print panjang tanpa error = END-TO-END OK)

Cek “efektif identitas” yang dipakai Terraform/SDK:

gcloud projects get-iam-policy "$PROJECT_ID" \
  --impersonate-service-account="$GOOGLE_IMPERSONATE_SERVICE_ACCOUNT" \
  --format='value(bindings.role)' | sort -u | head
# → Harusnya muncul role-role dari SA, bukan dari akun pribadi.

Step 6 — Sambungkan ke Terraform

Saat nanti bikin provider "google" di days-6-gcp-terragrunt/modules/* atau live/*, jangan pakai file JSON key. Cukup:

provider "google" {
  project                     = var.project_id
  impersonate_service_account = var.impersonate_sa
  region                      = var.region
}

Terraform akan otomatis pakai ADC yang sudah kita set di Step 4. Tidak ada secret yang perlu di-commit ke Git. 🎉

Leave a Reply

Your email address will not be published. Required fields are marked *