Cloud Run'dan Private CloudSQL'e bağlanma

1. Genel Bakış

Bu laboratuvarda, menü öğelerini eklemek, güncellemek, silmek ve listelemek için RESTful API'ler sunan Cymbal Eats menü hizmetini oluşturacaksınız. Cloud Run'da çalışacak olan menü hizmetinin arka uç veritabanı olarak bir Cloud SQL veritabanı oluşturacaksınız. Cloud Run, Cloud SQL veritabanasıyla aynı VPC'de bulunmadığından Cloud Run'ın özel bir IP adresi üzerinden Cloud SQL ile iletişim kurmasına izin vermek için sunucusuz VPC erişim bağlayıcısı yapılandırmanız gerekir.

19c7b05f35789fda.png

Öğrenecekleriniz

Bu laboratuvarda şunları yapmayı öğreneceksiniz:

  • Özel VPC ağını yapılandırma
  • Özel Postgres Cloud SQL veritabanı oluşturma
  • CloudRun'ı özel VPC'ye bağlama
  • Cloud SQL veritabanına bağlanan bir hizmeti Cloud Run'da dağıtma

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman bunu güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Ortam Kurulumu

  1. Proje ve kaynakla ilgili ortam değişkenleri oluşturma
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. Depoyu klonlayın ve dizine gidin
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. Hizmetleri etkinleştirme
gcloud services enable \
    sqladmin.googleapis.com \
    run.googleapis.com \
    vpcaccess.googleapis.com \
    servicenetworking.googleapis.com

3. Özel erişimi yapılandırma

Özel hizmetlere erişim, VPC ağınız ile Cloud SQL örneğinizin bulunduğu temel Google Cloud VPC ağı arasında bir VPC eşleme bağlantısı olarak sağlanır. Özel bağlantı, VPC ağınızdaki sanal makine örneklerinin ve kullandığınız hizmetlerin yalnızca dahili IP adresleri üzerinden iletişim kurmasına olanak tanır. Özel hizmet erişimi üzerinden kullanılabilen hizmetlere erişmek için sanal makine örneklerinin internet bağlantısı veya harici IP adresleri olması gerekmez.

  1. IP adresi aralığı ayırma
gcloud compute addresses create google-managed-services-default \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=20 \
    --network=projects/$PROJECT_ID/global/networks/default

Örnek çıkış

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
  1. Özel bağlantı oluşturun.
gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-default \
    --network=default \
    --project=$PROJECT_ID

Örnek çıkış

Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.

4. Cloud SQL'i ayarlama

Cloud SQL, buluttaki ilişkisel PostgreSQL ve MySQL veritabanlarınızı kurmayı, yönetmeyi ve bu veritabanlarının bakımını yapmayı kolaylaştıran, tümüyle yönetilen bir veritabanı hizmetidir. Her Cloud SQL örneği, Google Cloud ana makine sunucusunda çalışan bir sanal makine (VM) tarafından desteklenir. Yüksek kullanılabilirlik seçeneği, birincil sanal makineyle aynı kuruluma sahip başka bir alt bölgede yedek sanal makineyi de içerir. Veritabanı, sanal makineye bağlı olan ve kalıcı disk olarak bilinen ölçeklenebilir, uzun ömürlü bir ağ depolama cihazında tutulur. Bir uygulamanın bağlandığı IP adresinin Cloud SQL örneğinin kullanım ömrü boyunca sabit kalmasını sağlamak için her sanal makineye statik bir IP adresi atanır.

219cb722c2dd1b82.png

Özel IP adresine sahip bir Postgres Cloud SQL veritabanı oluşturacaksınız.

Veritabanı ve kullanıcı oluşturma

  1. Özel IP kullanmak için Postgres Cloud SQL örneği oluşturma
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}

Örnek çıkış

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. Veritabanı örneğine veritabanı ekleme
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

Örnek çıkış

Created database [menu-db].
instance: menu-catalog
name: menu-db
project: cymbal1
  1. SQL kullanıcısı oluşturma
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

Örnek çıkış

Created user [menu-user].
  1. Veritabanı IP adresini depolama
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. Compute Engine hizmet hesabına Cloud SQL İstemcisi rolünü ekleme
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"

Örnek çıkış

Updated IAM policy for project [cymbal1].
[...]

5. Sunucusuz VPC

Sunucusuz VPC Erişimi, Cloud Run, App Engine veya Cloud Functions gibi sunucusuz ortamlardan doğrudan Sanal Özel Bulut ağınıza bağlanmanıza olanak tanır. Sunucusuz VPC erişimini yapılandırma, sunucusuz ortamınızın dahili DNS ve dahili IP adreslerini (RFC 1918 ve RFC 6598'de tanımlandığı gibi) kullanarak VPC ağınıza istek göndermesine olanak tanır. Bu isteklere verilen yanıtlar da dahili ağınızı kullanır.

Cloud Run hizmetinin Cloud SQL'e bağlanması için bir Sunucusuz VPC Erişimi bağlayıcısı oluşturursunuz.

19c7b05f35789fda.png

  1. Cloud SQL örneğinizle aynı VPC ağında bir Sunucusuz VPC Erişimi bağlayıcısı oluşturun.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
    --region=${REGION} \
    --range=10.8.0.0/28

Örnek çıkış

Created connector [cymbalconnector].

6. Cloud Run'a dağıtma

Cloud Run'a bir Docker görüntüsü oluşturup dağıtacak ve Cloud SQL veritabanına erişmek için Cloud Run'ı Sunucusuz VPC bağlayıcısına bağlayacaksınız.

  1. Uygulamayı Maven kullanarak derleyin.
./mvnw package -DskipTests

Örnek çıkış

[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  42.864 s
[INFO] Finished at: 2022-04-28T16:15:33Z
[INFO] ------------------------------------------------------------------------
  1. Docker görüntüsü oluşturun:
docker build -f src/main/docker/Dockerfile.jvm \
    --tag gcr.io/$PROJECT_NAME/menu-service .

Örnek çıkış

[...]
Successfully built 4ef5d7a3befc
Successfully tagged gcr.io/cymbal1/menu-service:latest
  1. Docker görüntüsünü Container Registry'ye aktarın:
docker push gcr.io/$PROJECT_NAME/menu-service

Örnek çıkış

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. Menü hizmetini dağıtın:
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

Örnek çıkış

[...]
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, SQL kimlik bilgileri gibi hassas bilgileri depolamak için Secret Manager'ı kullanmanızı önerir. Cloud Run ile gizli dizeleri ortam değişkenleri olarak iletebilir veya birim olarak bağlayabilirsiniz.

  1. Mağaza menüsü hizmeti URL'si:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Menü hizmeti URL'sini doğrulama
echo $MENU_SERVICE_URL

Örnek çıkış

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

7. Hizmeti test etme

  1. POST isteği göndererek yeni menü öğesi oluşturma:
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!!"
   }'

Örnek çıkış

{
    "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. PUT isteği göndererek menü öğesinin durumunu değiştirme:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Ready"}'

Örnek çıkış

{
    "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. Tebrikler!

Tebrikler, codelab'i tamamladınız.

Sıradaki adım:

Diğer Cymbal Eats codelab'lerini keşfedin:

Temizleme

Bu eğitimde kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini önlemek amacıyla kaynakları içeren projeyi silin veya projeyi koruyup tek tek kaynakları silin.

Projeyi silme

Faturalandırılmanın önüne geçmenin en kolay yolu, eğitim için oluşturduğunuz projeyi silmektir.