Cloud Run'dan Private CloudSQL'e bağlanma

1. Genel Bakış

Bu laboratuvarda Cymbal Eats menü hizmetini oluşturacak ve böylece menü öğelerini ekleme, güncelleme, silme ve listeleme işlemlerini RESTful API'lere sunacaksınız. Cloud Run'da çalışacak menü hizmeti için arka uç veritabanı olarak bir Cloud SQL veritabanı oluşturacaksınız. Cloud Run, Cloud SQL veritabanıyla aynı VPC'de bulunmadığından Cloud Run'ın özel bir IP adresi aracılığıyla Cloud SQL ile iletişim kurmasını sağlamak için bir Sunucusuz VPC Erişimi bağlayıcısı yapılandırmanız gerekir.

19c7b05f35789fda.png

Öğrenecekleriniz

Bu laboratuvarda aşağıdakileri nasıl yapacağınızı öğreneceksiniz:

  • Özel VPC Ağını Yapılandırma
  • Özel Postgres Cloud SQL Veritabanı Oluşturma
  • CloudRun'ı Özel VPC'ye bağlama
  • Cloud Run'da Cloud SQL veritabanına bağlanan bir Hizmet dağıtma

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp 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. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğini (genellikle PROJECT_ID olarak tanımlanır) referans almanız gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz için bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırma yapılmaması için kaynakları kapatmak isterseniz oluşturduğunuz kaynakları silebilir veya projenin tamamını silebilirsiniz. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden 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 hizmetler erişimi, 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 aracılığıyla iletişim kurmasına olanak tanır. Sanal makine örnekleri, özel hizmet erişimi aracılığıyla kullanılabilen hizmetlere erişmek için internet bağlantısı veya harici IP adresleri gerektirmez.

  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 kurulumu

Cloud SQL, buluttaki PostgreSQL ve MySQL ilişkisel 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 tarafından desteklenir. Yüksek kullanılabilirlik seçeneği, birincil sanal makineyle aynı kuruluma sahip başka bir alt bölgede beklemedeki bir sanal makine de içerir. Veritabanı, sanal makineye bağlı olan ve kalıcı disk olarak bilinen ölçeklenebilir ve uzun ömürlü bir ağ depolama cihazında tutulur. Bir uygulamanın bağlandığı IP adresinin, Cloud SQL örneğinin ömrü boyunca sabit kalmasını sağlamak için her sanal makineye statik bir IP adresi atanır.

219cb722c2dd1b82.png

Özel bir IP adresiyle 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ının IP adresini depolayın
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. Cloud SQL İstemcisi rolünü Compute Engine hizmet hesabına 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şimi'ni yapılandırmak, sunucusuz ortamınızın dahili DNS ve dahili IP adreslerini (RFC 1918 ve RFC 6598'de tanımlandığı şekilde) kullanarak VPC ağınıza istek göndermesine olanak tanır. Bu isteklere verilen yanıtlar için dahili ağınız da kullanılır.

Cloud SQL'e bağlanmak amacıyla Cloud Run hizmeti için bir Sunucusuz VPC Erişimi bağlayıcısı oluşturacaksınız.

19c7b05f35789fda.png

  1. Cloud SQL örneğinizle aynı VPC ağında 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

Docker görüntüsü oluşturup Cloud Run'a 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 kaydına 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:
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 anahtarları ortam değişkenleri olarak iletebilir veya birim olarak ekleyebilirsiniz.

  1. Mağaza Menüsü hizmet 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şturun:
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ştirin:
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ğiticide kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız kaynakları içeren projeyi silin veya projeyi tutup tek tek kaynakları silin.

Projeyi silme

Faturalandırmayı ortadan kaldırmanın en kolay yolu, eğitim için oluşturduğunuz projeyi silmektir.