Cloud Scheduler ile Cloud Run İşleri Tetikleme

1. Genel Bakış

Bu laboratuvarda bir Cloud Run işi ve Cloud Scheduler işi oluşturacaksınız. Cymbal Eats Menu Service'ı kurulum komut dosyasını kullanarak dağıtacaksınız. Cymbal Eats Menu Service'e API çağrıları yapan bir Cloud Run işi oluşturacaksınız. İşi Google Cloud KSA'yı kullanarak yürütecek ve zaman çizelgesi oluşturacaksınız. Günlükleri inceleyerek ve menü öğelerinin silindiğini onaylamak için Menü Hizmeti'ne API çağrıları yaparak yürütme işlemini 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 işlem tamamlandığında çıkar.

Temizlik hizmeti işi

Temizlik hizmeti işi, Başarısız durumundaki menü öğelerini alıp siler. Yeni menü öğeleri oluşturulduğunda görüntüler, gıda maddesi olup olmadığını belirlemek için Vision API kullanılarak analiz edilir. Bu doğrulamada başarısız olan resimler için menü öğelerinin durumu Başarısız olarak güncellenir ve daha sonra temizleme işi tarafından silinir.

d74200f0bd14d350.png

Öğrenecekleriniz

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

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

Ön koşullar

  • Bu laboratuvarda Cloud Console ve kabuk ortamları hakkında bilgi sahibi olmanız gerekir.
  • Önceki Cloud Run ve Cloud Scheduler deneyimi yararlıdır ancak zorunlu değildir.

2. Kurulum ve Gereksinimler

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

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

eb0157a992f16fa3.png

Cloud Shell'den aşağıdaki komutu çalıştırarak bu depodan uygulama kodunu klonlayıp menü hizmetini içeren dizine gidin:

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

Kurulum komut dosyasını kullanarak Menü hizmetini Cloud Run'a dağıtın. Menü hizmeti, arka ucu için Cloud SQL Postgres veritabanı kullanılarak Quarkus çerçevesiyle oluşturulmuş Java tabanlı bir mikro hizmettir. Menü 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 çalıştırdıktan sonra sonraki adımlara geçin.

3. Cloud Run iş kodunu keşfetme

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

45f480cd1b9a995.png

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

cd ~/cymbal-eats/cleanup-service

Bu dizindeki temizleme hizmeti, gerekli bağımlılıklara(httpie, jq) sahip temizlik hizmeti işi için container 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 olarak aşağıdakilere 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 aktarılır.
  • FAILED_ITEM_AGE - Başarısız öğenin silinmesinden önceki dakika sayısı.
  • MENU_SERVICE_URL - Cymbal Eats Menü hizmet URL'si.

4. Cloud Run İşi Oluşturma

Şimdi bir container görüntüsü derleyip Artifact Registry'de yayınlayacaksınız.

Bu container 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

Docker görüntülerini temizlik işi için depolamak amacıyla yeni bir Artifact Registry deposu oluşturun:

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

Cloud Build kullanarak container görüntüsü derleyin ve tek bir komutla Artifact Registry'ye aktarın:

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 gidip yayınlanan görüntüyü inceleyin:

fb95ae38baa7c543.png

İkinci Cloud Shell sekmesine geri dönün. Menü hizmetini tanımlamak 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 (FAILED_ITEM_AGE tarafından belirlenir) başarısız menü öğelerini temizlemek için bir Cloud Run işi oluşturun.

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 İSTİHDAMALAR bölümüne gidin ve oluşturulan işi inceleyin.

İşi tıklayın ve mevcut sekmeleri keşfedin: GEÇMİŞ, GÜNLÜKLER, YAPILANDIRMA ve YAML.

b12c8e312de3b66.png

Konsolda işin YAPILANDIRMA bölümünü inceleyerek ortam değişkenlerinin ayarlandığını doğrulayın:

724c2919d05349c8.png

(İsteğe bağlı) Başarısız Öğe Yaşı veya Menü Hizmeti URL'si değişkenlerini değiştirmek istiyorsanız Cloud Run işi oluşturulduktan sonra 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
 

İş çıkışını incelemek için GÜNLÜKLER sekmesine geçin. Günlüklerde, Başarısız Öğe Yaşı ve Menü Hizmeti URL'si gösterilir.

518cb00036a2561f.png

5. Cloud Run İş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şleriyle çalışırken güvenlikle ilgili en iyi uygulamalardan biri, her işi ayrı kimlik bilgileriyle yürütmektir. Bu adımda temizlik 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 İşlerine çağrı yapmak için izne ihtiyacı vardır.

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

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

Şimdi, temizlik hizmeti işini çalıştırmak için bir program 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 planlayıcı işi oluşturacaksınız.

Gösterim amaçlı olarak, programı 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 İşini çağırmak için kullanılan uri parametresini inceleyin:

  • REGION ve PROJECT_ID - Temizlik hizmeti işinin dağıtıldığı Cloud Run Bölgesi ve Proje Kimliği
  • cleanup-service - Cloud Run İşinin adı

Oluşturulan planlayıcı işini incelemek için konsolda Cloud Scheduler'a gidin:

3bc9120df7fc6ed.png

İşlemler menüsünden kullanılabilir seçenekleri inceleyin.

7945908025dd2f2b.png

6. Cloud Run İşini Test Etme

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

curl ${MENU_SERVICE_URL}/menu | jq

Çıkış:

Ready durumunda 3 menü öğesi göreceksiniz.

Menü öğesi 1'in 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 silinebilmesi için FAILED_ITEM_AGE parametresi tarafından ayarlanan 1 dakika eski olması gerekir.

Konsoldan bir sonraki planlanmış çalıştırmayı bekleyebilir veya iş yürütmeyi zorunlu kılabilirsiniz.

Bir işi tetiklemenin kullanıcı arayüzü veya komut satırı gibi birden fazla yolu vardır.

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

  1. Cloud Scheduler'dan "İşi çalıştırmayı zorunlu kıl"ı seçerek seçeneğini belirleyin.

6c8cbeae6165ba4a.png

  1. Cloud Run İşi'nden "Yürüt"ü tıklayarak düğmesini tıklayın.

229c22288882b5c3.png

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

Cloud Run İŞLER bölümüne gidin, GÜNLÜKLER sekmesini açın ve menü öğesinin silindiğini doğrulayın.

50829ae27b135b2d.png

Günlükleri "silme" işlemine göre filtreleyin anahtar kelimesini kullanabilirsiniz.

d94fb9e444b1c1b8.png

REST uç noktası aracılığıyla 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öreceksiniz.

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üldüğünü doğrulama

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.