Menghubungkan ke Private CloudSQL dari Cloud Run

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.

19c7b05f35789fda.pngS

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

  1. 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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.
  1. 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

  1. 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
  1. Clone repositori dan buka direktori
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. 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.

  1. 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].
  1. 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.

219cb722c2dd1b82.pngS

Anda akan membuat database Cloud SQL Postgres dengan alamat IP pribadi.

Membuat database dan pengguna

  1. 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
  1. 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
  1. Membuat pengguna SQL
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

Contoh output

Created user [menu-user].
  1. Menyimpan alamat IP database
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. 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.

19c7b05f35789fda.pngS

  1. 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.

  1. 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] ------------------------------------------------------------------------
  1. 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
  1. 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
  1. 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.

  1. URL layanan Menu Toko:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Memverifikasi URL layanan menu
echo $MENU_SERVICE_URL

Contoh output

https://menu-service-g2mfphytdq-uk.a.run.app

7. Menguji layanan

  1. 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"
}
  1. 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:

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.