1. Pengenalan Cloud Run
Google Cloud Run adalah platform serverless fully managed yang memungkinkan Anda menjalankan container tanpa perlu mengelola server, cluster, atau infrastruktur apapun. Cloud Run otomatis menghandle scaling — dari 0 hingga ribuan instance — berdasarkan traffic yang masuk. Anda hanya perlu menyediakan container image dan Cloud Run akan mengurus sisanya.
Diperkenalkan pada Google Cloud Next 2019, Cloud Run menjadi populer karena menyederhanakan deployment aplikasi container. Berbeda dengan Kubernetes yang memerlukan manajemen cluster, atau GKE Autopilot yang lebih kompleks, Cloud Run menawarkan pengalaman yang sangat sederhana — satu perintah untuk deploy, dan aplikasi langsung bisa diakses.
Mengapa Cloud Run?
| Keunggulan | Penjelasan |
|---|---|
| Zero Server Management | Tidak perlu mengelola VM, cluster, atau node |
| Scale to Zero | Bayar hanya saat request aktif — 0 request = 0 biaya |
| Auto-scaling | Otomatis scale dari 0 hingga 1000+ instance |
| Any Language | Gunakan bahasa apapun — Node.js, Python, Go, Rust, Java, PHP |
| Portable | Berbasis standar container — bisa dipindahkan ke platform lain |
| Fast Deploys | Deploy dalam hitungan detik, bukan menit |
| Built-in HTTPS | Endpoint HTTPS otomatis tanpa konfigurasi SSL |
| Pay-per-use | Bayar per request, per CPU time, dan memori yang digunakan |
Perbandingan dengan Alternatif GCP
| Fitur | Cloud Run | Cloud Functions | GKE Autopilot |
|---|---|---|---|
| Unit Deploy | Container image | Function code | Pod / Container |
| Scale to Zero | ✅ Ya | ✅ Ya | ❌ Tidak |
| Concurrency | Up to 1000/instance | 1 per instance | Tidak dibatasi |
| Max Timeout | 60 menit | 9 menit | Tidak ada |
| Complexity | 🟢 Rendah | 🟢 Rendah | 🔴 Tinggi |
| WebSocket | ✅ Didukung | ❌ Tidak | ✅ Didukung |
| Use Case | Web app, API, microservice | Event handler, webhook | Complex workloads |
2. Konsep Dasar: Container, Services, Jobs
Cloud Run Service
Service adalah unit utama di Cloud Run. Setiap service memiliki satu atau lebih revisions, dan menerima HTTP request dari internet. Service otomatis scale berdasarkan jumlah request yang masuk.
Cloud Run Job
Job adalah unit untuk tugas yang bersifat batch — berjalan sekali dan selesai. Berbeda dengan Service yang selalu menunggu request, Job menjalankan task, lalu berhenti. Cocok untuk ETL, data processing, scheduled tasks.
Container Image
Cloud Run menggunakan container image standar (OCI) yang bisa dibangun dengan Dockerfile apapun. Image disimpan di Artifact Registry (recommended) atau Docker Hub, GitHub Container Registry, dll.
flowchart TD
subgraph service["☁️ Cloud Run SERVICE"]
direction TB
S1["HTTP Request"] --> S2["Auto-scaled\nContainers"]
S2 --> S3["Always running"]
S3 --> S4["Use Cases:\n- Web apps\n- APIs"]
end
subgraph job["⚙️ Cloud Run JOB"]
direction TB
J1["Trigger"] --> J2["Batch Tasks\n1-N parallel"]
J2 --> J3["Run to completion"]
J3 --> J4["Use Cases:\n- ETL jobs\n- Data migration"]
end
style service fill:#0f2a1f,stroke:#3ecf8e,stroke-width:2px
style job fill:#0f1d3a,stroke:#60a5fa,stroke-width:2px
Region dan Availability
Cloud Run tersedia di lebih dari 30 region di seluruh dunia. Setiap region menyimpan container image dan menjalankan instances dekat dengan user. Multi-region deployment dimungkinkan dengan Cloud Load Balancing.
3. Deploy Aplikasi ke Cloud Run
Prerequisites
Manage Revisions
# === TRAFFIC SPLITTING COMMANDS ===
# Default: 100% ke revisi terbaru
gcloud run deploy my-service \
--image my-app:v2.0 \
--region asia-southeast1
# Split traffic: 90% v1, 10% v2 (canary)
gcloud run services update-traffic my-service \
--to-revisions my-service-00001=90,my-service-00002=10 \
--region asia-southeast1
# Gradual rollout: 80% v1, 20% v2
gcloud run services update-traffic my-service \
--to-revisions my-service-00001=80,my-service-00002=20 \
--region asia-southeast1
# Complete rollout: 100% ke v2
gcloud run services update-traffic my-service \
--to-revisions my-service-00002=100 \
--region asia-southeast1
# Rollback: 100% ke v1
gcloud run services update-traffic my-service \
--to-revisions my-service-00001=100 \
--region asia-southeast1
# Deploy tanpa langsung menerima traffic (--no-traffic)
gcloud run deploy my-service \
--image my-app:v3.0 \
--no-traffic \
--region asia-southeast1
# Revision baru dibuat tapi tidak menerima traffic
# Untuk testing via URL khusus sebelum promote
# Promote revision yang di-test
gcloud run services update-traffic my-service \
--to-revisions my-service-00003=100 \
--region asia-southeast1
# Lihat traffic distribution saat ini
gcloud run services describe my-service \
--region asia-southeast1 \
--format "table(status.traffic.revisionName, status.traffic.percent, status.traffic.tag)"
Tagged Revisions untuk Testing
# Deploy dengan tag (preview URL)
gcloud run deploy my-service \
--image my-app:v3.0 \
--tag staging \
--no-traffic \
--region asia-southeast1
# Akses via tagged URL untuk testing
# Format: https://staging----uc.a.run.app
# Tidak mempengaruhi traffic production
# Update tag
gcloud run services update-traffic my-service \
--update-tags staging=my-service-00003 \
--region asia-southeast1
# Remove tag
gcloud run services update-traffic my-service \
--remove-tags staging \
--region asia-southeast1
# Promote tagged revision ke production
gcloud run services update-traffic my-service \
--to-revisions my-service-00003=100 \
--region asia-southeast1
Gunakan --no-traffic saat deploy untuk mencegah revision baru langsung menerima traffic. Test dulu via tagged URL, lalu promote ke production jika sudah yakin. Ini mengurangi risiko deployment yang buruk.
7. Auto-scaling dan Konfigurasi
Cara Kerja Auto-scaling
Cloud Run secara otomatis menambah atau mengurangi instances berdasarkan jumlah concurrent requests. Setiap instance bisa menerima 1-80 concurrent request (configurable). Ketika semua instance penuh, Cloud Run menambah instance baru. Ketika traffic turun, instance idle akan di-scale down ke nol.
Konfigurasi Resource
| Parameter | Range | Default |
|---|---|---|
| CPU | 1, 2, 4, 6, 8 vCPU | 1 vCPU |
| Memory | 128 MiB - 32 GiB | 256 MiB |
| Concurrency | 1 - 1000 | 80 |
| Timeout | 1 - 3600 detik (60 menit) | 300 detik |
| Min Instances | 0 - 1000 | 0 |
| Max Instances | 0 - 1000 | 100 |
| Request timeout | 1s - 3600s | 300s |
# Deploy dengan full configuration
gcloud run deploy my-service \
--image my-app:latest \
--region asia-southeast1 \
--cpu 2 \
--memory 1Gi \
--concurrency 100 \
--timeout 600 \
--min-instances 1 \
--max-instances 50 \
--port 8080
# Update resource tanpa redeploy
gcloud run services update my-service \
--region asia-southeast1 \
--cpu 4 \
--memory 2Gi \
--max-instances 100
# CPU allocation modes:
# --cpu-boost : Startup CPU boost (allocasi CPU lebih saat cold start)
# --cpu-throttled: CPU throttled saat tidak menerima request
# --no-cpu-throttle: CPU selalu allocated (untuk background processing)
# Deploy dengan startup CPU boost
gcloud run deploy my-service \
--image my-app:latest \
--cpu-boost \
--region asia-southeast1
# CPU always allocated (untuk WebSockets atau background tasks)
gcloud run deploy my-service \
--image my-app:latest \
--no-cpu-throttle \
--min-instances 1 \
--region asia-southeast1
Cold Start Mitigation
Cold start terjadi ketika Cloud Run perlu membuat instance baru karena tidak ada instance yang idle. Ini bisa menambah 1-5 detik latency. Cara mengatasi: (1) set --min-instances 1 untuk menjaga minimal 1 instance tetap hidup, (2) gunakan --cpu-boost untuk percepat startup, (3) buat container image sekecil mungkin.
8. Custom Domains dan HTTPS
# Map custom domain ke Cloud Run service
gcloud run domain-mappings create \
--service my-service \
--domain myapp.example.com \
--region asia-southeast1
# Output akan menunjukkan DNS records yang perlu ditambahkan:
# NAME TYPE DATA
# myapp A 216.239.32.21
# myapp AAAA 2001:4860:4802:32::15
# _ghs CNAME ghs.googlehosted.com.
# Setelah DNS dikonfigurasi, SSL certificate otomatis dibuat
# List domain mappings
gcloud run domain-mappings list --region asia-southeast1
# Deskripsi mapping
gcloud run domain-mappings describe myapp.example.com \
--region asia-southeast1
# Delete domain mapping
gcloud run domain-mappings delete myapp.example.com \
--region asia-southeast1
# Dengan Google-managed SSL certificate (otomatis)
# Cloud Run otomatis provisioning SSL cert untuk custom domain
# Pastikan DNS record benar dan propagated
Multi-region dengan Load Balancer
# Deploy ke beberapa region
gcloud run deploy my-service-asia \
--image my-app:latest \
--region asia-southeast1
gcloud run deploy my-service-us \
--image my-app:latest \
--region us-central1
gcloud run deploy my-service-eu \
--image my-app:latest \
--region europe-west1
# Buat Serverless NEG (Network Endpoint Group) untuk setiap region
gcloud compute network-endpoint-groups create neg-asia \
--region=asia-southeast1 \
--serverless-service=my-service-asia
gcloud compute network-endpoint-groups create neg-us \
--region=us-central1 \
--serverless-service=my-service-us
# Buat Load Balancer dengan URL Map
# (Lebih detail di Google Cloud Load Balancing docs)
9. Cloud Run Jobs
Cloud Run Jobs cocok untuk tugas yang berjalan sekali dan selesai — seperti ETL, migration, scheduled reports, dan batch processing.
# Buat Cloud Run Job
gcloud run jobs create etl-job \
--image my-etl-image:latest \
--region asia-southeast1 \
--tasks 10 \
--parallelism 5 \
--memory 2Gi \
--cpu 2 \
--max-retries 3 \
--set-env-vars "SOURCE=gs://my-bucket/data/*"
# Execute job
gcloud run jobs execute etl-job --region asia-southeast1
# Execute dengan override parameters
gcloud run jobs execute etl-job \
--region asia-southeast1 \
--tasks 20 \
--parallelism 10
# Cek status execution
gcloud run jobs executions describe etl-job-xxxxx \
--region asia-southeast1
# List executions
gcloud run jobs executions list \
--job etl-job \
--region asia-southeast1
# Lihat logs dari execution
gcloud run jobs executions describe etl-job-xxxxx \
--region asia-southeast1 \
--format 'value(status.executionCompletionStatus)'
# Update job
gcloud run jobs update etl-job \
--region asia-southeast1 \
--memory 4Gi \
--tasks 20
# Schedule job dengan Cloud Scheduler
gcloud scheduler jobs create http etl-daily \
--location asia-southeast1 \
--schedule "0 2 * * *" \
--uri "https://run.googleapis.com/v2/projects/my-project/locations/asia-southeast1/jobs/etl-job:run" \
--http-method POST \
--oauth-service-account-email scheduler@my-project.iam.gserviceaccount.com
# Delete job
gcloud run jobs delete etl-job --region asia-southeast1
10. Integrasi dengan GCP Services
Cloud SQL Connection
# Deploy dengan Cloud SQL connection
gcloud run deploy my-service \
--image my-app:latest \
--region asia-southeast1 \
--add-cloudsql-instances my-project:asia-southeast1:my-db \
--set-env-vars "INSTANCE_CONNECTION_NAME=my-project:asia-southeast1:my-db"
# Gunakan Cloud SQL Auth Proxy (recommended)
# Environment variables untuk koneksi database:
# DB_HOST=/cloudsql/my-project:asia-southeast1:my-db
# DB_USER=postgres
# DB_PASS=secret-from-secret-manager
# DB_NAME=myapp
Pub/Sub Integration
# Cloud Run bisa subscribe ke Pub/Sub topics
# Buat service account untuk Pub/Sub push
gcloud iam service-accounts create pubsub-invoker \
--display-name "Pub/Sub to Cloud Run Invoker"
# Berikan permission
gcloud run services add-iam-policy-binding my-service \
--region asia-southeast1 \
--member serviceAccount:pubsub-invoker@my-project.iam.gserviceaccount.com \
--role roles/run.invoker
# Create Pub/Sub subscription yang push ke Cloud Run
gcloud pubsub subscriptions create my-subscription \
--topic my-topic \
--push-endpoint=https://my-service-xxx.a.run.app/pubsub \
--push-auth-service-account=pubsub-invoker@my-project.iam.gserviceaccount.com
VPC Connector untuk Private Resources
# Buat VPC Connector
gcloud compute networks vpc-access connector create my-connector \
--region asia-southeast1 \
--subnet projects/my-project/regions/asia-southeast1/subnetworks/default \
--min-instances 2 \
--max-instances 10
# Deploy dengan VPC connector
gcloud run deploy my-service \
--image my-app:latest \
--region asia-southeast1 \
--vpc-connector my-connector \
--set-env-vars "REDIS_HOST=10.0.0.5"
# Sekarang service bisa mengakses resources di VPC:
# - Cloud SQL private IP
# - Redis/Memcached
# - Internal microservices
# - Private APIs
11. Best Practices
| Best Practice | Detail |
|---|---|
| Stateless Apps | Cloud Run instances bisa dihentikan kapanpun. Jangan simpan state di container. Gunakan external storage (Cloud Storage, Cloud SQL, Redis) |
| Graceful Shutdown | Handle SIGTERM signal untuk cleanup sebelum container dihentikan. Timeout 10 detik default |
| Health Checks | Implementasi /health endpoint. Cloud Run menggunakan ini untuk menentukan kesehatan instance |
| Min Instances | Gunakan --min-instances 1 untuk production services yang sensitif terhadap cold start |
| Concurrency | Turunkan concurrency jika app CPU-intensive. Naikkan jika I/O-bound (waiting database) |
| Image Size | Gunakan multi-stage build dan Alpine base images. Image kecil = deploy cepat + cold start cepat |
| Secrets | Jangan taruh secrets di environment variables langsung. Gunakan Secret Manager |
| IAM | Gunakan least-privilege. Jangan gunakan --allow-unauthenticated untuk internal services |
| Logging | Output logs ke stdout/stderr. Cloud Run otomatis mengirim ke Cloud Logging |
| Startup Probe | Implementasi startup readiness. Cloud Run akan mengirim traffic setelah container start |
Untuk mengurangi cold start, gunakan kombinasi --min-instances 1 + --cpu-boost + image sekecil mungkin. Untuk WebSocket atau streaming, gunakan --no-cpu-throttle dan set --min-instances 1.
12. Quiz Pemahaman
📝 Quiz: Pemahaman Google Cloud Run
1. Apa keunggulan utama Cloud Run dibanding GKE?
2. Apa yang terjadi saat Cloud Run menerima request tapi semua instance penuh?
3. Untuk apa --no-traffic digunakan saat deploy?
4. Apa itu Revision dalam Cloud Run?
5. Environment variable apa yang HARUS didengarkan oleh container di Cloud Run?