Cloud Scheduler ile Cloud Run İşleri Tetikleme

1. Genel Bakış

Bu laboratuvarda bir Cloud Run işi oluşturacak ve bir Cloud Scheduler işi ayarlayacaksınız. Kurulum komut dosyasını kullanarak Cymbal Eats Menu Service'i dağıtırsınız. Cymbal Eats Menu Service'e API çağrıları yapan bir Cloud Run işi oluşturacaksınız. İşi Google Cloud CLI kullanarak yürütecek ve iş için bir plan oluşturacaksınız. Günlükleri inceleyerek ve menü öğelerinin silindiğini doğrulamak için Menü Hizmeti'ne API çağrıları yaparak yürütmeyi doğrulayacaksınız.

Cloud Run işleri nedir?

Cloud Run işi, web isteklerine hizmet vermeyen ancak bunun yerine operasyonel görevleri veya veri işlemeyi yürüten bir container çalıştırır. Kapsayıcı, görevi çalıştırır ve tamamlandığında çıkar.

Temizleme hizmeti işi

Temizleme hizmeti işi, "Başarısız" durumundaki menü öğelerini alır ve siler. Yeni menü öğeleri oluşturulduğunda, öğenin yemek olup olmadığını tespit etmek için Vision API kullanılarak resimler analiz edilir. Bu doğrulama başarısız olursa menü öğelerinin durumu "Başarısız" olarak güncellenir ve ardından temizleme işi tarafından silinir.

d74200f0bd14d350.png

Öğrenecekleriniz

Bu laboratuvarda şunları yapmayı öğreneceksiniz:

  • Cloud Run işleri oluşturma
  • Cloud Run işlerini yürütme
  • Cloud Scheduler işleri oluşturma
  • İşlerin yürütülmesini doğrulama

Ön koşullar

  • Bu laboratuvarda Cloud Console ve kabuk ortamları hakkında bilgi sahibi olduğunuz varsayılır.
  • Daha önce Cloud Run ve Cloud Scheduler deneyiminiz olması yardımcı olur ancak zorunlu değildir.

2. Kurulum ve Gereksinimler

Cloud projesi 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

Arama çubuğunun sağındaki simgeyi tıklayarak Cloud Shell'i etkinleştirin.

eb0157a992f16fa3.png

Cloud Shell'de, uygulama kodunu bu depodan klonlamak ve menü hizmetini içeren dizine gitmek için aşağıdaki komutu çalıştırın:

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

Kurulum komut dosyasını kullanarak Menu hizmetini Cloud Run'a dağıtın. Menü hizmeti, arka ucu için Cloud SQL Postgres veritabanını kullanan Quarkus çerçevesiyle oluşturulmuş Java tabanlı bir mikro hizmettir. Menu hizmeti, aşağıdaki adımlarda oluşturacağınız Cloud Run işi için çalışma zamanı bağımlılığıdır.

./setup.sh

Dağıtımın, gerekli tüm bileşenleri oluşturması yaklaşık 10 dakika sürer.

Yukarıdaki komutu yürüttükten sonra sonraki adımlarla devam edin.

3. Cloud Run Job kodunu keşfedin

Artı simgesini tıklayarak Cloud Shell'de yeni bir sekme açın.

45f480cd1b9a995.png

Temizleme hizmetini içeren dizine gidin ve işi oluşturan dosyaları inceleyin:

cd ~/cymbal-eats/cleanup-service

Bu dizindeki cleanup-service, gerekli bağımlılıklarla(httpie, jq) temizleme hizmeti işi için kapsayıcı görüntüsünü tanımlayan bir Dockerfile içerir.

Dockerfile

FROM ubuntu:latest 
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]

Aşağıda listelenen gerçek temizleme komut dosyası, başarısız durumdaki menü öğelerinin listesini almak ve Menü hizmetine API çağrıları yaparak bunları silmek için komutlar içerir.

script.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

Komut dosyasıyla ilgili aşağıdaki noktalara dikkat edin:

  • FAILED_ITEM_AGE ve MENU_SERVICE_URL ortam değişkenleri dağıtım sırasında ayarlanır ve Cloud Run işi tarafından iletilir.
  • FAILED_ITEM_AGE - Başarısız öğenin silinmeden önce geçmesi gereken dakika sayısı.
  • MENU_SERVICE_URL: Cymbal Eats Menu hizmet URL'si.

4. Cloud Run işi oluşturma

Ardından bir container görüntüsü oluşturup Artifact Registry'de yayınlayacaksınız.

Bu kapsayıcı görüntüsü, Cloud Run işi oluşturmak için kullanılır.

Hizmet API'lerini etkinleştirin:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudscheduler.googleapis.com \
    --quiet

Ortam değişkenlerini ayarlayın:

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

Temizleme işi için Docker görüntülerini depolamak üzere yeni bir Artifact Registry deposu oluşturun:

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

Cloud Build kullanarak kapsayıcı görüntüsü oluşturma ve tek bir komutla Artifact Registry'ye aktarma:

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

Örnek çıkış:

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

Yayınlama işlemi tamamlandıktan sonra Artifact Registry'ye gidin ve yayınlanan resmi inceleyin:

fb95ae38baa7c543.png

İkinci Cloud Shell sekmesine geri dönün. Menü hizmetini açıklamak ve URL'yi ortam değişkenine kaydetmek için aşağıdaki komutu çalıştırın. Bu ortam değişkeni, Cloud Run işini yapılandırmak için kullanılır.

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")

1 dakikadan eski olan başarısız menü öğelerini temizlemek için bir Cloud Run işi oluşturun [FAILED_ITEM_AGE tarafından ayarlanır].

gcloud beta run jobs create cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

Örnek çıkış:

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

Konsolda Cloud Run İŞLER bölümüne gidin ve oluşturulan işi inceleyin.

İşi tıklayın ve kullanılabilir sekmeleri (GEÇMİŞ, GÜNLÜKLER, YAPILANDIRMA ve YAML) inceleyin.

b12c8e312de3b66.png

Konsoldaki işin CONFIGURATION (Yapılandırma) bölümünü inceleyerek ortam değişkenlerinin ayarlandığını doğrulayın:

724c2919d05349c8.png

(İsteğe bağlı) Cloud Run işi oluşturulduktan sonra Failed Item Age veya Menu Service URL değişkenlerini değiştirmek isterseniz güncelleme komutunu kullanabilirsiniz:

gcloud beta run jobs update cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

İşi doğrulamak için aşağıdaki komutu çalıştırarak Cloud Run işini yürütün:

gcloud beta run jobs execute cleanup-service --region=$REGION

Örnek çıkış:

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

İşin çıkışını incelemek için GÜNLÜKLER sekmesine geçin. Günlüklerde Failed Item Age (Başarısız Öğenin Yaşı) ve Menu Service URL (Menü Hizmeti URL'si) değerlerini görmeniz gerekir.

518cb00036a2561f.png

5. Cloud Run işi için program oluşturma

Cloud Scheduler, tümüyle yönetilen, kurumsal düzeyde bir cron işi planlayıcıdır. Toplu işler, büyük veri işleri, bulut altyapısı işlemleri dahil olmak üzere neredeyse her işi planlamanıza olanak tanır.

Cloud Scheduler işiyle çalışırken güvenlik açısından en iyi uygulamalardan biri, her işi ayrı kimlik bilgileriyle yürütmektir. Bu adımda, temizleme planlayıcı işi tarafından kullanılacak bir hizmet hesabı oluşturun.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Cloud Scheduler işinin, Cloud Run işlerine çağrı yapabilmesi için izinlere ihtiyacı vardır.

Cloud Scheduler işinde kullanılan hizmet hesabına Cloud Run Invoker rolünü verin:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

Ardından, temizleme hizmeti işini çalıştırmak için bir plan ayarlayacaksınız.

Cloud Scheduler tarafından desteklenen birden fazla hedef türü vardır.

  • HTTP
  • Pub/Sub
  • App Engine HTTP

HTTP hedef türünü kullanarak bir planlanmış görev oluşturacaksınız.

Bu demoda, görevi 5 dakikada bir çalışacak şekilde planlayacaksınız.

gcloud scheduler jobs create http cleanup-schedule \
    --location $REGION \
    --schedule="*/5 * * * *" \
    --uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
    --http-method POST \
    --oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

Cloud Run işini çağırmak için kullanılan uri parametresini inceleyin:

  • REGION ve PROJECT_ID: Temizleme hizmeti işinin dağıtıldığı Cloud Run bölgesi ve proje kimliği
  • cleanup-service - Cloud Run işinin adı

Oluşturulan planlanmış işi incelemek için konsolda Cloud Scheduler'a gidin:

3bc9120df7fc6ed.png

İşlemler menüsündeki seçenekleri inceleyin.

7945908025dd2f2b.png

6. Cloud Run işini test etme

Menü Hizmeti uç noktalarını kullanarak mevcut menü öğelerini ve durumlarını inceleyin:

curl ${MENU_SERVICE_URL}/menu | jq

Çıkış:

Ready durumunda 3 menü öğesi görürsünüz.

1 numaralı menü öğesinin durumunu Failed olarak değiştirin:

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Failed"}' | jq

1 dakika bekleyin. Menü öğesinin silinmesi için FAILED_ITEM_AGE parametresinde belirtildiği gibi 1 dakika önce oluşturulmuş olması gerekir.

Bir sonraki planlanmış çalıştırmayı bekleyebilir veya konsoldan işin yürütülmesini zorlayabilirsiniz.

Kullanıcı arayüzü veya komut satırı üzerinden bir işi tetiklemenin birden çok yolu vardır.

Bu örnekte, işi tetiklemek için Cloud Shell'de(3. seçenek) komut çalıştırın.

  1. İşlemler menüsünden "İşi çalıştırmaya zorla"yı seçerek Cloud Scheduler'dan.

6c8cbeae6165ba4a.png

  1. "EXECUTE" (ÇALIŞTIR) düğmesini tıklayarak Cloud Run Job'dan.

229c22288882b5c3.png

  1. Aşağıdaki komutu çalıştırarak Cloud Shell'den:
gcloud beta run jobs execute cleanup-service --region=$REGION

Cloud Run JOBS bölümüne gidin, LOGS (Günlükler) sekmesini açın ve menü öğesinin silindiğini doğrulayın.

50829ae27b135b2d.png

Günlükleri bulmak için "silme" anahtar kelimesine göre filtreleyin.

d94fb9e444b1c1b8.png

REST uç noktası üzerinden mevcut menü öğelerini kontrol etmek için Menü Hizmeti uç noktalarını kullanın.

curl ${MENU_SERVICE_URL}/menu | jq

Çıkış:

Ready durumunda 2 menü öğesi görürsünüz.

7. Tebrikler!

Tebrikler, codelab'i tamamladınız.

İşlediğimiz konular:

  • Cloud Run işleri oluşturma
  • Cloud Run işlerini yürütme
  • Cloud Scheduler işleri oluşturma
  • İşlerin yürütülmesini doğrulama

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.