1. Ringkasan
Di lab ini, Anda akan membuat layanan menu Cymbal Eats, yang mengekspos RESTful API untuk menambahkan, memperbarui, menghapus, dan mencantumkan item menu. Anda akan membuat database Cloud SQL sebagai database backend untuk layanan menu, yang akan berjalan di Cloud Run. Karena Cloud Run tidak berada di VPC yang sama dengan database Cloud SQL, Anda harus mengonfigurasi konektor Akses VPC Serverless untuk mengizinkan Cloud Run berkomunikasi dengan Cloud SQL melalui alamat IP pribadi.

Yang akan Anda pelajari
Di lab ini, Anda akan mempelajari cara melakukan hal-hal berikut:
- Mengonfigurasi Jaringan VPC Pribadi
- Membuat Database Cloud SQL Postgres Pribadi
- Menghubungkan CloudRun ke VPC Pribadi
- Men-deploy Layanan di Cloud Run yang terhubung ke database Cloud SQL
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.



- Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
- Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (biasanya diidentifikasi sebagai
PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan melihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada selama durasi project. - Sebagai informasi, ada nilai ketiga, Project Number yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
- Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Penyiapan Lingkungan
- Membuat variabel lingkungan terkait project dan resource
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service
export SERVERLESS_VPC_CONNECTOR=cymbalconnector
export DB_INSTANCE_NAME=menu-catalog
export DB_INSTANCE_PASSWORD=password123
export DB_DATABASE=menu-db
export DB_USER=menu-user
export DB_PASSWORD=menupassword123
- Buat clone repositori dan buka direktori
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- Aktifkan layanan
gcloud services enable \
sqladmin.googleapis.com \
run.googleapis.com \
vpcaccess.googleapis.com \
servicenetworking.googleapis.com
3. Mengonfigurasi Akses Pribadi
Akses layanan pribadi disediakan sebagai link peering VPC antara jaringan VPC Anda dan jaringan VPC Google Cloud yang mendasarinya tempat instance Cloud SQL Anda berada. Koneksi pribadi memungkinkan instance VM di jaringan VPC Anda dan layanan yang Anda gunakan berkomunikasi hanya melalui alamat IP internal. Untuk mengakses layanan yang tersedia melalui akses layanan pribadi, instance VM tidak memerlukan konektivitas Internet atau alamat IP eksternal.
- Mengalokasikan rentang alamat IP
gcloud compute addresses create google-managed-services-default \
--global \
--purpose=VPC_PEERING \
--prefix-length=20 \
--network=projects/$PROJECT_ID/global/networks/default
Contoh output
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
- Membuat koneksi pribadi
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services-default \
--network=default \
--project=$PROJECT_ID
Contoh output
Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.
4. Menyiapkan Cloud SQL
Cloud SQL adalah layanan database terkelola sepenuhnya yang memudahkan penyiapan, pemeliharaan, pengelolaan, dan pengaturan database relasional PostgreSQL dan MySQL di cloud. Setiap instance Cloud SQL didukung oleh mesin virtual (VM) yang berjalan di server host Google Cloud. Opsi ketersediaan tinggi juga mencakup VM standby di zona lain dengan penyiapan yang sama seperti VM utama. Database disimpan di perangkat penyimpanan jaringan yang skalabel dan tahan lama yang dikenal sebagai persistent disk, yang terhubung ke VM. Alamat IP statis ditetapkan ke setiap VM untuk memastikan bahwa alamat IP yang terhubung ke aplikasi tetap konstan selama masa pakai instance Cloud SQL.

Anda akan membuat database Postgres Cloud SQL dengan alamat IP pribadi.
Membuat database dan pengguna
- Membuat instance Cloud SQL Postgres untuk menggunakan IP pribadi
gcloud sql instances create $DB_INSTANCE_NAME \
--project=$PROJECT_ID \
--network=projects/$PROJECT_ID/global/networks/default \
--no-assign-ip \
--database-version=POSTGRES_12 \
--cpu=2 \
--memory=4GB \
--region=$REGION \
--root-password=${DB_INSTANCE_PASSWORD}
Contoh output
Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/cymbal1/instances/menu-instance]. NAME: menu-instance DATABASE_VERSION: POSTGRES_12 LOCATION: us-east1-a TIER: db-custom-2-4096 PRIMARY_ADDRESS: - PRIVATE_ADDRESS: 10.8.80.5 STATUS: RUNNABLE
- Menambahkan database ke instance database
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME
Contoh output
Created database [menu-db]. instance: menu-catalog name: menu-db project: cymbal1
- Membuat pengguna SQL
gcloud sql users create ${DB_USER} \
--password=$DB_PASSWORD \
--instance=$DB_INSTANCE_NAME
Contoh output
Created user [menu-user].
- Simpan alamat IP database
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
--format=json | jq \
--raw-output ".ipAddresses[].ipAddress")
- Menambahkan peran Klien Cloud SQL ke akun layanan Compute Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"
Contoh output
Updated IAM policy for project [cymbal1]. [...]
5. VPC Serverless
Dengan Akses VPC Serverless, Anda dapat terhubung langsung ke jaringan Virtual Private Cloud dari lingkungan serverless seperti Cloud Run, App Engine, atau Cloud Functions. Dengan mengonfigurasi Akses VPC Serverless, lingkungan serverless Anda dapat mengirim permintaan ke jaringan VPC Anda menggunakan DNS internal dan alamat IP internal (sebagaimana ditentukan oleh RFC 1918 dan RFC 6598). Respons terhadap permintaan ini juga menggunakan jaringan internal Anda.
Anda akan membuat konektor Akses VPC Serverless agar layanan Cloud Run dapat terhubung ke Cloud SQL.

- Buat konektor Akses VPC Serverless di jaringan VPC yang sama dengan instance Cloud SQL Anda.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
--region=${REGION} \
--range=10.8.0.0/28
Contoh output
Created connector [cymbalconnector].
6. Men-deploy ke Cloud Run
Anda akan membangun dan men-deploy image Docker ke Cloud Run serta menghubungkan Cloud Run ke konektor VPC Serverless untuk mengakses database Cloud SQL.
- Kompilasi aplikasi menggunakan maven
./mvnw package -DskipTests
Contoh output
[...] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 42.864 s [INFO] Finished at: 2022-04-28T16:15:33Z [INFO] ------------------------------------------------------------------------
- Bangun image Docker:
docker build -f src/main/docker/Dockerfile.jvm \
--tag gcr.io/$PROJECT_NAME/menu-service .
Contoh output
[...] Successfully built 4ef5d7a3befc Successfully tagged gcr.io/cymbal1/menu-service:latest
- Kirim image Docker ke container registry:
docker push gcr.io/$PROJECT_NAME/menu-service
Contoh output
Using default tag: latest The push refers to repository [gcr.io/cymbalsql/menu-service] 17b374963800: Pushed d9a51c06430d: Pushed fff5d2a2cfc9: Pushed f21fceb558c6: Pushed 5ffbbbf218dd: Pushed 60609ec85f86: Layer already exists f2c4302f03b8: Layer already exists latest: digest: sha256:f64cb7c288dbf4ad9b12bd210c23c5aec1048dee040450ff2d9dbdf96e83a426 size: 1789
- Men-deploy layanan Menu:
gcloud run deploy $MENU_SERVICE_NAME \
--image=gcr.io/$PROJECT_NAME/menu-service:latest \
--region $REGION \
--allow-unauthenticated \
--set-env-vars DB_USER=$DB_USER \
--set-env-vars DB_PASS=$DB_PASSWORD \
--set-env-vars DB_DATABASE=$DB_DATABASE \
--set-env-vars DB_HOST=$DB_INSTANCE_IP \
--vpc-connector $SERVERLESS_VPC_CONNECTOR \
--project=$PROJECT_ID \
--quiet
Contoh output
[...] Done. Service [menu-service] revision [menu-service-00002-xox] has been deployed and is serving 100 percent of traffic. Service URL: https://menu-service-g2mfphytdq-uk.a.run.app
Google merekomendasikan agar Anda menggunakan Secret Manager untuk menyimpan informasi sensitif seperti kredensial SQL. Anda dapat meneruskan secret sebagai variabel lingkungan atau memasangnya sebagai volume dengan Cloud Run.
- URL layanan Menu Toko:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- Verifikasi URL layanan menu
echo $MENU_SERVICE_URL
Contoh output
https://menu-service-g2mfphytdq-uk.a.run.app
7. Menguji layanan
- Buat item menu baru dengan mengirim permintaan POST:
curl -X POST "${MENU_SERVICE_URL}/menu" \
-H 'Content-Type: application/json' \
-d '{
"itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"itemName": "Curry Plate",
"itemPrice": 12.5,
"itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"spiceLevel": 3,
"status": "Ready",
"tagLine": "Spicy touch for your taste buds!!"
}'
Contoh output
{
"id": 16,
"createDateTime": "2022-04-28T18:14:04.17225",
"itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"itemName": "Curry Plate",
"itemPrice": 12.5,
"itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"spiceLevel": 3,
"status": "Processing",
"tagLine": "Spicy touch for your taste buds!!",
"updateDateTime": "2022-04-28T18:14:04.172298"
}
- Ubah status item menu dengan mengirim permintaan PUT:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
-H 'Content-Type: application/json' \
-d '{"status": "Ready"}'
Contoh output
{
"id": 1,
"createDateTime": "2022-04-28T17:21:02.369093",
"itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"itemName": "Curry Plate",
"itemPrice": 12.50,
"itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
"spiceLevel": 0,
"status": "Ready",
"tagLine": "Spicy touch for your taste buds!!",
"updateDateTime": "2022-04-28T17:21:02.657636"
}
8. Selamat!
Selamat, Anda telah menyelesaikan codelab!
Langkah berikutnya:
Pelajari codelab Cymbal Eats lainnya:
- Memicu Cloud Workflows dengan Eventarc
- Memicu Pemrosesan Peristiwa dari Cloud Storage
- Menghubungkan ke Database yang Dikelola Sepenuhnya dari Cloud Run
- Mengamankan Aplikasi Serverless dengan Identity Aware Proxy (IAP)
- Memicu Tugas Cloud Run dengan Cloud Scheduler
- Men-deploy ke Cloud Run dengan Aman
- Mengamankan Traffic Ingress Cloud Run
- Menghubungkan ke AlloyDB pribadi dari GKE Autopilot
Pembersihan
Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Menghapus project
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.