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.
Öğ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 SQL veritabanına bağlanan bir Hizmet'i Cloud Run'da dağıtma
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- 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.
- 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.
- 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
- 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
- Depoyu klonlayın ve dizine gidin
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
- 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 aracılığıyla iletişim kurmasına olanak tanır. Sanal makine örnekleri, özel hizmetlere erişim aracılığıyla kullanılabilen hizmetlere erişmek için internet bağlantısı veya harici IP adresleri gerektirmez.
- 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].
- Ö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.
Özel bir IP adresiyle Postgres Cloud SQL veritabanı oluşturacaksınız.
Veritabanı ve kullanıcı oluşturma
- Ö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
- 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
- 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].
- 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")
- 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.
- 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.
- 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] ------------------------------------------------------------------------
- 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
- 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
- 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.
- 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")
- Menü hizmeti URL'sini doğrulama
echo $MENU_SERVICE_URL
Örnek çıkış
https://menu-service-g2mfphytdq-uk.a.run.app
7. Hizmeti test etme
- 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" }
- 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:
- Eventarc ile Cloud Workflows'u tetikleme
- Cloud Storage'dan Etkinlik İşlemeyi Tetikleme
- Cloud Run'dan Tümüyle Yönetilen Veritabanlarına Bağlanma
- Identity Aware Proxy (IAP) ile Güvenli Sunucusuz Uygulama
- Cloud Scheduler ile Cloud Run İşlerini Tetikleme
- Cloud Run'a Güvenli Şekilde Dağıtma
- Cloud Run Giriş Trafiğinin Güvenliğini Sağlama
- GKE Autopilot'tan özel AlloyDB'ye bağlanma
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.