Lewati ke konten

Setup Project Kelompok

KoordinatorBelum diuji

Panduan ini digunakan oleh pemegang akun Google Cloud Platform (GCP) yang mengelola Billing Account dan kredit pelatihan. Skema awal memakai satu project untuk satu peserta. Pengujian pada 10–11 September 2026 menemukan batas tiga project berbayar pada Billing Account yang dipakai. Skema operasional kemudian diubah menjadi satu project untuk lima asisten trainer.

Skema ini ditujukan untuk kelompok pelatihan yang saling percaya. Asisten mendapat role luas pada project kelompok sehingga mereka dapat melihat dan mengubah resource asisten lain. Jangan memakai skema ini pada project produksi.

Bagian yang sudah diuji dengan satu email dan satu project:

  1. Pembuatan project dan penautan Billing Account.
  2. Pengaktifan API bersama.
  3. Pemberian role IAM kepada satu email.
  4. Pembuatan resource bersama: firewall, Artifact Registry, dan budget alert.

Bagian yang belum diuji dan menjadi tugas bersama:

  1. Undangan kelima email asisten pada satu project yang sama.
  2. Pemberian sepuluh role kepada lima email sekaligus.
  3. Pembuatan lima GitHub connection dalam satu project.
  4. Pemeriksaan bahwa role IAM tidak saling menimpa antar asisten.

Catat hasil setiap langkah pada workbook asisten trainer.

Gunakan panduan uji project kelompok saat lima akun menguji deployment bersama dalam satu project.

Setelah panduan ini selesai:

  1. Satu project kelompok terhubung ke Billing Account penyelenggara.
  2. Lima email asisten memiliki sepuluh role yang dibutuhkan.
  3. API, firewall, Artifact Registry, dan budget alert tersedia sebagai resource bersama.
  4. Setiap asisten mempunyai identitas penamaan yang unik untuk VM, Service Account, GitHub connection, trigger, image, alamat IP, dan DNS zone.
  5. Satu Billing Account memakai tiga project kelompok. Setiap project menampung lima asisten sehingga kapasitas totalnya 15 asisten.

Kredit berada pada Billing Account dan dipakai bersama oleh semua project yang terhubung. Asisten tidak menerima role pada Billing Account.

Billing Account Arkabumi
├── geoportal-kelompok-a-xxxxx Asisten A01–A05
├── geoportal-kelompok-b-xxxxx Asisten B01–B05
└── geoportal-kelompok-c-xxxxx Asisten C01–C05

Skema operasional ini menetapkan tiga project kelompok untuk satu Billing Account. Batas tiga project berbayar berasal dari hasil pengujian Billing Account yang dipakai, bukan batas umum seluruh akun GCP.

Buka Cloud Shell memakai akun master, lalu tentukan nilai berikut:

Cloud Shell akun master
PROJECT_ID="geoportal-kelompok-a-xxxxx"
PROJECT_NAME="Geoportal Kelompok A"
BILLING_ACCOUNT_ID="ISI_BILLING_ACCOUNT_ID"
REGION="asia-southeast2"
ZONE="asia-southeast2-b"

Untuk project kelompok baru, gunakan suffix acak agar Project ID unik secara global:

Cloud Shell akun master
SUFFIX="$(openssl rand -hex 3 | cut -c1-5)"
PROJECT_ID="geoportal-kelompok-b-${SUFFIX}"
echo "$PROJECT_ID"

Project ID tidak dapat diganti setelah project dibuat. Simpan Project ID final dalam catatan operasional asisten.

Lewati perintah pembuatan jika project sudah tersedia.

Cloud Shell akun master
gcloud projects create "$PROJECT_ID" \
--name="$PROJECT_NAME"
gcloud billing projects link "$PROJECT_ID" \
--billing-account="$BILLING_ACCOUNT_ID"
gcloud config set project "$PROJECT_ID"

Periksa status billing:

Cloud Shell akun master
gcloud billing projects describe "$PROJECT_ID"

Nilai billingEnabled harus true sebelum resource berbayar dibuat.

API cukup diaktifkan satu kali pada setiap project kelompok. Asisten tidak perlu mengulangi langkah ini.

Cloud Shell akun master
gcloud services enable \
compute.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
iap.googleapis.com \
dns.googleapis.com \
domains.googleapis.com \
secretmanager.googleapis.com

Periksa hasilnya:

Cloud Shell akun master
gcloud services list --enabled \
--filter="config.name:(compute.googleapis.com OR cloudbuild.googleapis.com OR artifactregistry.googleapis.com OR iap.googleapis.com OR dns.googleapis.com OR domains.googleapis.com OR secretmanager.googleapis.com)" \
--format="value(config.name)"

Contoh mapping Project Kelompok A:

Kode Email Slug resource
A01 asisten01@example.com nama01
A02 asisten02@example.com nama02
A03 asisten03@example.com nama03
A04 asisten04@example.com nama04
A05 asisten05@example.com nama05

Jalankan binding dari akun master:

Cloud Shell akun master
PARTICIPANTS=(
"asisten01@example.com"
"asisten02@example.com"
"asisten03@example.com"
"asisten04@example.com"
"asisten05@example.com"
)
ROLES=(
roles/editor
roles/resourcemanager.projectIamAdmin
roles/serviceusage.serviceUsageAdmin
roles/iam.serviceAccountAdmin
roles/iam.serviceAccountUser
roles/compute.osAdminLogin
roles/iap.tunnelResourceAccessor
roles/cloudbuild.connectionAdmin
roles/domains.admin
roles/dns.admin
)
for EMAIL in "${PARTICIPANTS[@]}"; do
for ROLE in "${ROLES[@]}"; do
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member="user:$EMAIL" \
--role="$ROLE" \
--condition=None \
--quiet
done
done

--condition=None mencegah prompt interaktif ketika policy sudah memiliki binding bersyarat dari Cloud Build.

Role Fungsi dalam pelatihan
roles/editor Membuat dan mengelola sebagian besar resource project.
roles/resourcemanager.projectIamAdmin Memberikan role deployment kepada Service Account.
roles/serviceusage.serviceUsageAdmin Mengaktifkan API jika ada API yang terlewat.
roles/iam.serviceAccountAdmin Membuat dan mengelola Service Account deployment.
roles/iam.serviceAccountUser Memakai Service Account pada VM dan trigger.
roles/compute.osAdminLogin Login administratif ke VM melalui OS Login.
roles/iap.tunnelResourceAccessor Membuka SSH melalui Identity-Aware Proxy (IAP).
roles/cloudbuild.connectionAdmin Membuat GitHub connection dan linked repository.
roles/domains.admin Mendaftarkan dan mengelola Cloud Domains.
roles/dns.admin Membuat DNS zone dan record Cloud DNS.

roles/resourcemanager.projectIamAdmin dan roles/editor memberi akses luas. Asisten dapat mengubah resource asisten lain dalam project yang sama. Skema ini diterima untuk uji deployment asisten pada pelatihan terkontrol, tetapi pemilik akun tetap perlu memantau perubahan.

Cloud Build menyimpan token GitHub di Secret Manager. Buat identitas layanan Cloud Build, lalu berikan akses sementara kepada Cloud Build Service Agent:

Cloud Shell akun master
gcloud beta services identity create \
--service=cloudbuild.googleapis.com \
--project="$PROJECT_ID"
PROJECT_NUMBER="$(gcloud projects describe "$PROJECT_ID" \
--format="value(projectNumber)")"
CLOUD_BUILD_SERVICE_AGENT="service-${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member="serviceAccount:$CLOUD_BUILD_SERVICE_AGENT" \
--role="roles/secretmanager.admin" \
--condition=None

Biarkan role ini tersedia selama lima asisten membuat GitHub connection. Setelah semua connection berstatus COMPLETE, cabut kembali:

Cloud Shell akun master
gcloud projects remove-iam-policy-binding "$PROJECT_ID" \
--member="serviceAccount:$CLOUD_BUILD_SERVICE_AGENT" \
--role="roles/secretmanager.admin" \
--condition=None

Artifact Registry, firewall, dan network tag dipakai bersama. Jangan meminta setiap asisten membuat resource ini karena nama yang sama akan menghasilkan error ALREADY_EXISTS.

Cloud Shell akun master
gcloud artifacts repositories create katalog-images \
--repository-format=docker \
--location="$REGION" \
--description="Docker image bersama pelatihan WebGIS"
Cloud Shell akun master
gcloud compute firewall-rules create allow-webgis-http \
--network=default \
--direction=INGRESS \
--action=ALLOW \
--rules=tcp:80,tcp:443 \
--source-ranges=0.0.0.0/0 \
--target-tags=webgis-http
Cloud Shell akun master
gcloud compute firewall-rules create allow-webgis-iap-ssh \
--network=default \
--direction=INGRESS \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20 \
--target-tags=webgis-iap-ssh

Asisten boleh memakai nama sendiri selama slug memakai huruf kecil, angka, atau tanda hubung dan tidak sama dengan asisten lain.

Resource Hifni Koko Reza Dhany
GitHub connection github-nama01 github-nama02 github-nama03 github-nama04
Linked repository repo-nama01 repo-nama02 repo-nama03 repo-nama04
Trigger deploy-nama01 deploy-nama02 deploy-nama03 deploy-nama04
Service Account cb-deployer-nama01 cb-deployer-nama02 cb-deployer-nama03 cb-deployer-nama04
VM webgis-nama01 webgis-nama02 webgis-nama03 webgis-nama04
Image nextjs-nama01 nextjs-nama02 nextjs-nama03 nextjs-nama04
Static IP webgis-ip-nama01 webgis-ip-nama02 webgis-ip-nama03 webgis-ip-nama04
DNS zone geoportal-nama01 geoportal-nama02 geoportal-nama03 geoportal-nama04

Path /opt/webgis/app, Docker Compose project app, Artifact Registry katalog-images, dan network tag boleh sama karena setiap asisten memakai VM yang berbeda.

Buat budget dari akun master melalui Billing, lalu Budgets & alerts. Gunakan konfigurasi berikut untuk project kelompok yang meliputi pembelian domain:

Pengaturan Nilai
Jenis Alerts only
Scope Satu project kelompok
Periode Monthly
Nominal USD 75
Threshold aktual 50%, 80%, dan 100%
Threshold perkiraan 100% forecasted

Keluarkan promotional credits dari pilihan Savings jika pemilik akun ingin memantau biaya kotor sebelum kredit trial diterapkan. Budget alert hanya mengirim notifikasi. Alert tidak menghentikan VM, Cloud Build, pembelian domain, atau billing.

Tambahkan budget USD 250 pada seluruh Billing Account sebagai pengaman kedua. Nilai ini menyisakan ruang dari kredit awal USD 300, tetapi pemilik akun tetap harus memeriksa saldo kredit dan Billing Reports selama pelatihan.

Periksa billing, resource bersama, dan sepuluh role setiap asisten:

Cloud Shell akun master
gcloud billing projects describe "$PROJECT_ID"
gcloud artifacts repositories describe katalog-images \
--location="$REGION"
gcloud compute firewall-rules list \
--filter="name:(allow-webgis-http OR allow-webgis-iap-ssh)"
for EMAIL in "${PARTICIPANTS[@]}"; do
echo "IAM untuk $EMAIL"
gcloud projects get-iam-policy "$PROJECT_ID" \
--flatten="bindings[].members" \
--filter="bindings.members=user:$EMAIL" \
--format="value(bindings.role)" \
| sort
done

Kirim informasi berikut kepada asisten:

Project ID: geoportal-kelompok-a-xxxxx
Region: asia-southeast2
Zone: asia-southeast2-b
Slug asisten: nama01, nama02, nama03, atau nama04
Artifact Registry bersama: katalog-images
App directory: /opt/webgis/app

Checklist sebelum sesi:

  1. Billing project aktif.
  2. Sepuluh role tersedia untuk lima email.
  3. API sudah aktif.
  4. Artifact Registry dan dua firewall rule sudah tersedia.
  5. Budget alert project dan Billing Account sudah aktif.
  6. Kuota region cukup untuk lima VM e2-medium, yaitu sepuluh vCPU.
  7. Setiap asisten menerima slug yang berbeda.

Setiap asisten menghentikan VM miliknya setelah sesi:

Cloud Shell akun master
gcloud compute instances stop "webgis-NAMA" \
--zone="asia-southeast2-b" \
--project="$PROJECT_ID"

Disk dan alamat IP tertentu masih dapat menimbulkan biaya saat VM berhenti. Biaya compute VM berhenti berjalan setelah status instance menjadi TERMINATED.

Gunakan daftar role yang sama seperti bagian 5:

Cloud Shell akun master
for EMAIL in "${PARTICIPANTS[@]}"; do
for ROLE in "${ROLES[@]}"; do
gcloud projects remove-iam-policy-binding "$PROJECT_ID" \
--member="user:$EMAIL" \
--role="$ROLE" \
--condition=None \
--quiet
done
done

Periksa kembali policy sebelum project dipakai untuk kelompok berikutnya.

Bagian ini dipakai saat satu project pengujian tidak diperlukan lagi dan seluruh isinya ingin dihapus, misalnya karena pengujian lama sudah selesai dan akan diganti dengan skema project kelompok.

Jangan menghapus sebelum daftarnya dilihat. Jalankan dari Cloud Shell dengan akun pemilik project:

Cloud Shell project lama
PROJECT_ID="PROJECT_ID"
REGION="asia-southeast2"
ZONE="asia-southeast2-b"
gcloud config set project "$PROJECT_ID"
gcloud compute instances list
gcloud compute disks list
gcloud compute addresses list
gcloud artifacts repositories list --location="$REGION"
gcloud builds connections list --region="$REGION"
gcloud builds triggers list --region="$REGION"
gcloud iam service-accounts list
gcloud compute firewall-rules list
gcloud secrets list

Catat setiap nama yang muncul. Periksa juga apakah ada VM yang masih menyala, karena VM yang menyala tetap menagih biaya selama proses pembongkaran.

Cloud Shell project lama
gcloud compute instances stop NAMA_VM --zone="$ZONE"

Hentikan seluruh VM sebelum menghapus apa pun. Langkah ini menghentikan biaya compute paling besar lebih dahulu, sehingga sisa proses bisa dikerjakan tanpa terburu-buru.

Urutan ini penting. Hapus VM sebelum disk, karena disk tidak bisa dihapus saat masih terpasang.

Cloud Shell project lama
# VM beserta boot disk-nya
gcloud compute instances delete NAMA_VM \
--zone="$ZONE" \
--delete-disks=all \
--quiet
# Static IP supaya tidak ditagih saat menganggur
gcloud compute addresses delete NAMA_STATIC_IP \
--region="$REGION" \
--quiet
# Disk sisa dari VM yang sudah tidak ada
gcloud compute disks delete NAMA_DISK \
--zone="$ZONE" \
--quiet

Ulangi untuk setiap VM dan disk yang tercatat pada langkah 1.

Cloud Shell project lama
# Image container, termasuk seluruh tag di dalamnya
gcloud artifacts repositories delete katalog-images \
--location="$REGION" \
--quiet
# Trigger sebelum connection, karena trigger memakai connection
gcloud builds triggers delete NAMA_TRIGGER --region="$REGION" --quiet
gcloud builds connections delete NAMA_CONNECTION --region="$REGION" --quiet
# Service Account deployment milik setiap asisten
gcloud iam service-accounts delete NAMA_SA@PROJECT_ID.iam.gserviceaccount.com --quiet
# Firewall bersama
gcloud compute firewall-rules delete allow-webgis-http allow-webgis-iap-ssh --quiet

Hapus trigger lebih dahulu daripada connection. Connection yang masih dipakai trigger akan menolak dihapus.

Cloud Shell project lama
gcloud compute instances list
gcloud compute disks list
gcloud compute addresses list
gcloud artifacts repositories list --location="$REGION"
gcloud builds connections list --region="$REGION"
gcloud builds triggers list --region="$REGION"
gcloud iam service-accounts list
gcloud compute firewall-rules list

Seluruh perintah harus menghasilkan daftar kosong atau hanya berisi Service Account bawaan Compute Engine. Service Account default tidak perlu dihapus.

Setelah langkah 5 bersih, lepas Billing Account dari project supaya tidak ada lagi tagihan yang mungkin muncul:

  1. Buka Billing pada Google Cloud Console.
  2. Pilih Account management atau daftar project pada Billing Account.
  3. Pilih project lama, lalu Disable billing.

Langkah 7: Pilihan lain, hapus project sekaligus

Section titled “Langkah 7: Pilihan lain, hapus project sekaligus”

Kalau seluruh isi project memang tidak diperlukan lagi dan project-nya bukan bagian dari skema tiga project kelompok, menghapus project lebih singkat daripada menghapus resource satu per satu:

Cloud Shell project lama
gcloud projects delete "$PROJECT_ID"

Penghapusan project bersifat sementara selama 30 hari. Selama masa itu project bisa dipulihkan, tetapi seluruh resource di dalamnya sudah tidak berjalan dan tidak ditagih. Setelah 30 hari project hilang permanen.

Jangan memakai cara ini untuk project kelompok yang masih akan dipakai pelatihan.

Script create-project-peserta.sh membuat satu project untuk setiap email. Script tersebut disimpan sebagai catatan pendekatan awal, tetapi tidak dipakai pada skema satu project untuk lima asisten. Gunakan langkah pada panduan ini untuk membuat Project Kelompok B dan Project Kelompok C.