1. Ringkasan
Di lab ini, Anda akan membuat layanan menu Cymbal Eats, 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 dijalankan di Cloud Run. Karena Cloud Run tidak berada di VPC yang sama dengan database Cloud SQL, Anda harus mengonfigurasi konektor Akses VPC Serverless agar Cloud Run dapat 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
peduli tentang apa itu. Di sebagian besar codelab, Anda harus mereferensikan Project ID (biasanya diidentifikasi sebagai
PROJECT_ID
). Jika Anda tidak menyukai ID yang dihasilkan, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan lihat 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. Untuk 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
- Clone repositori dan buka direktori
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- Mengaktifkan layanan
gcloud services enable \
sqladmin.googleapis.com \
run.googleapis.com \
vpcaccess.googleapis.com \
servicenetworking.googleapis.com
3. Konfigurasi 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 untuk 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 virtual machine (VM) yang berjalan di server host Google Cloud. Opsi ketersediaan tinggi juga menyertakan VM standby di zona lain dengan penyiapan yang sama dengan 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 dengan aplikasi tetap konstan selama masa pakai instance Cloud SQL.
Anda akan membuat database Cloud SQL Postgres 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].
- Menyimpan 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
Akses VPC Serverless memungkinkan Anda 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 menggunakan DNS internal dan alamat IP internal (sebagaimana ditetapkan dalam RFC 1918 dan RFC 6598). Respons atas permintaan ini juga menggunakan jaringan internal Anda.
Anda akan membuat konektor Akses VPC Serverless untuk layanan Cloud Run agar 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.
- Mengompilasi 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
- Mengirim 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
- 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")
- Memverifikasi 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 mengirimkan 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
- Terhubung ke Database yang Terkelola Sepenuhnya dari Cloud Run
- Aplikasi Serverless yang Aman dengan Identity-Aware Proxy (IAP)
- Memicu Tugas Cloud Run dengan Cloud Scheduler
- Men-deploy dengan Aman ke Cloud Run
- Mengamankan Traffic Masuk Cloud Run
- Terhubung ke AlloyDB pribadi dari Autopilot GKE
Pembersihan
Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource, atau simpan project dan hapus resource satu per satu.
Menghapus project
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.