Setup Project Kelompok
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.
Status pengujian
Section titled “Status pengujian”Bagian yang sudah diuji dengan satu email dan satu project:
- Pembuatan project dan penautan Billing Account.
- Pengaktifan API bersama.
- Pemberian role IAM kepada satu email.
- Pembuatan resource bersama: firewall, Artifact Registry, dan budget alert.
Bagian yang belum diuji dan menjadi tugas bersama:
- Undangan kelima email asisten pada satu project yang sama.
- Pemberian sepuluh role kepada lima email sekaligus.
- Pembuatan lima GitHub connection dalam satu project.
- 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.
Hasil akhir yang diharapkan
Section titled “Hasil akhir yang diharapkan”Setelah panduan ini selesai:
- Satu project kelompok terhubung ke Billing Account penyelenggara.
- Lima email asisten memiliki sepuluh role yang dibutuhkan.
- API, firewall, Artifact Registry, dan budget alert tersedia sebagai resource bersama.
- Setiap asisten mempunyai identitas penamaan yang unik untuk VM, Service Account, GitHub connection, trigger, image, alamat IP, dan DNS zone.
- Satu Billing Account memakai tiga project kelompok. Setiap project menampung lima asisten sehingga kapasitas totalnya 15 asisten.
1. Struktur project kelompok
Section titled “1. Struktur project kelompok”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–C05Skema 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.
2. Siapkan nilai project
Section titled “2. Siapkan nilai project”Buka Cloud Shell memakai akun master, lalu tentukan nilai berikut:
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:
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.
3. Buat project dan hubungkan billing
Section titled “3. Buat project dan hubungkan billing”Lewati perintah pembuatan jika project sudah tersedia.
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:
gcloud billing projects describe "$PROJECT_ID"Nilai billingEnabled harus true sebelum resource berbayar dibuat.
4. Aktifkan API sebagai resource bersama
Section titled “4. Aktifkan API sebagai resource bersama”API cukup diaktifkan satu kali pada setiap project kelompok. Asisten tidak perlu mengulangi langkah ini.
gcloud services enable \ compute.googleapis.com \ cloudbuild.googleapis.com \ artifactregistry.googleapis.com \ iap.googleapis.com \ dns.googleapis.com \ domains.googleapis.com \ secretmanager.googleapis.comPeriksa hasilnya:
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)"5. Berikan IAM kepada lima asisten
Section titled “5. Berikan IAM kepada lima asisten”Contoh mapping Project Kelompok A:
| Kode | 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:
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 donedone--condition=None mencegah prompt interaktif ketika policy sudah memiliki binding
bersyarat dari Cloud Build.
Fungsi setiap role
Section titled “Fungsi setiap role”| 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.
6. Siapkan akses GitHub connection
Section titled “6. Siapkan akses GitHub connection”Cloud Build menyimpan token GitHub di Secret Manager. Buat identitas layanan Cloud Build, lalu berikan akses sementara kepada Cloud Build Service Agent:
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=NoneBiarkan role ini tersedia selama lima asisten membuat GitHub connection. Setelah semua
connection berstatus COMPLETE, cabut kembali:
gcloud projects remove-iam-policy-binding "$PROJECT_ID" \ --member="serviceAccount:$CLOUD_BUILD_SERVICE_AGENT" \ --role="roles/secretmanager.admin" \ --condition=None7. Buat resource bersama project
Section titled “7. Buat resource bersama project”Artifact Registry, firewall, dan network tag dipakai bersama. Jangan meminta setiap
asisten membuat resource ini karena nama yang sama akan menghasilkan error
ALREADY_EXISTS.
Artifact Registry
Section titled “Artifact Registry”gcloud artifacts repositories create katalog-images \ --repository-format=docker \ --location="$REGION" \ --description="Docker image bersama pelatihan WebGIS"Firewall HTTP dan HTTPS
Section titled “Firewall HTTP dan HTTPS”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-httpFirewall SSH melalui IAP
Section titled “Firewall SSH melalui IAP”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-ssh8. Tetapkan pola nama unik
Section titled “8. Tetapkan pola nama unik”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.
9. Buat budget alert
Section titled “9. Buat budget alert”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.
10. Verifikasi sebelum diserahkan
Section titled “10. Verifikasi sebelum diserahkan”Periksa billing, resource bersama, dan sepuluh role setiap asisten:
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)" \ | sortdoneKirim informasi berikut kepada asisten:
Project ID: geoportal-kelompok-a-xxxxxRegion: asia-southeast2Zone: asia-southeast2-bSlug asisten: nama01, nama02, nama03, atau nama04Artifact Registry bersama: katalog-imagesApp directory: /opt/webgis/appChecklist sebelum sesi:
- Billing project aktif.
- Sepuluh role tersedia untuk lima email.
- API sudah aktif.
- Artifact Registry dan dua firewall rule sudah tersedia.
- Budget alert project dan Billing Account sudah aktif.
- Kuota region cukup untuk lima VM
e2-medium, yaitu sepuluh vCPU. - Setiap asisten menerima slug yang berbeda.
11. Kendalikan biaya
Section titled “11. Kendalikan biaya”Setiap asisten menghentikan VM miliknya setelah sesi:
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.
12. Cabut akses setelah pelatihan
Section titled “12. Cabut akses setelah pelatihan”Gunakan daftar role yang sama seperti bagian 5:
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 donedonePeriksa kembali policy sebelum project dipakai untuk kelompok berikutnya.
13. Bongkar project pengujian lama
Section titled “13. Bongkar project pengujian lama”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.
Langkah 1: Daftar semua yang akan dihapus
Section titled “Langkah 1: Daftar semua yang akan dihapus”Jangan menghapus sebelum daftarnya dilihat. Jalankan dari Cloud Shell dengan akun pemilik project:
PROJECT_ID="PROJECT_ID"REGION="asia-southeast2"ZONE="asia-southeast2-b"
gcloud config set project "$PROJECT_ID"
gcloud compute instances listgcloud compute disks listgcloud compute addresses listgcloud artifacts repositories list --location="$REGION"gcloud builds connections list --region="$REGION"gcloud builds triggers list --region="$REGION"gcloud iam service-accounts listgcloud compute firewall-rules listgcloud secrets listCatat setiap nama yang muncul. Periksa juga apakah ada VM yang masih menyala, karena VM yang menyala tetap menagih biaya selama proses pembongkaran.
Langkah 2: Hentikan VM lebih dahulu
Section titled “Langkah 2: Hentikan VM lebih dahulu”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.
Langkah 3: Hapus resource berbayar
Section titled “Langkah 3: Hapus resource berbayar”Urutan ini penting. Hapus VM sebelum disk, karena disk tidak bisa dihapus saat masih terpasang.
# VM beserta boot disk-nyagcloud compute instances delete NAMA_VM \ --zone="$ZONE" \ --delete-disks=all \ --quiet
# Static IP supaya tidak ditagih saat menganggurgcloud compute addresses delete NAMA_STATIC_IP \ --region="$REGION" \ --quiet
# Disk sisa dari VM yang sudah tidak adagcloud compute disks delete NAMA_DISK \ --zone="$ZONE" \ --quietUlangi untuk setiap VM dan disk yang tercatat pada langkah 1.
Langkah 4: Hapus resource pendukung
Section titled “Langkah 4: Hapus resource pendukung”# Image container, termasuk seluruh tag di dalamnyagcloud artifacts repositories delete katalog-images \ --location="$REGION" \ --quiet
# Trigger sebelum connection, karena trigger memakai connectiongcloud builds triggers delete NAMA_TRIGGER --region="$REGION" --quietgcloud builds connections delete NAMA_CONNECTION --region="$REGION" --quiet
# Service Account deployment milik setiap asistengcloud iam service-accounts delete NAMA_SA@PROJECT_ID.iam.gserviceaccount.com --quiet
# Firewall bersamagcloud compute firewall-rules delete allow-webgis-http allow-webgis-iap-ssh --quietHapus trigger lebih dahulu daripada connection. Connection yang masih dipakai trigger akan menolak dihapus.
Langkah 5: Periksa sisa resource
Section titled “Langkah 5: Periksa sisa resource”gcloud compute instances listgcloud compute disks listgcloud compute addresses listgcloud artifacts repositories list --location="$REGION"gcloud builds connections list --region="$REGION"gcloud builds triggers list --region="$REGION"gcloud iam service-accounts listgcloud compute firewall-rules listSeluruh perintah harus menghasilkan daftar kosong atau hanya berisi Service Account bawaan Compute Engine. Service Account default tidak perlu dihapus.
Langkah 6: Lepas billing
Section titled “Langkah 6: Lepas billing”Setelah langkah 5 bersih, lepas Billing Account dari project supaya tidak ada lagi tagihan yang mungkin muncul:
- Buka Billing pada Google Cloud Console.
- Pilih Account management atau daftar project pada Billing Account.
- 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:
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.
14. Status script lama
Section titled “14. Status script lama”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.