Memicu Tugas Cloud Run dengan Cloud Scheduler

1. Ringkasan

Di lab ini, Anda akan membuat tugas Cloud Run dan menyiapkan tugas Cloud Scheduler. Anda akan men-deploy Cymbal Eats Menu Service menggunakan skrip pengaturan. Anda akan membuat tugas Cloud Run yang melakukan panggilan API ke Layanan Cymbal Eats Menu. Anda akan menjalankan tugas menggunakan Google Cloud CLI dan menyiapkan jadwal untuk tugas tersebut. Anda akan memverifikasi eksekusi dengan meninjau log dan melakukan panggilan API ke Layanan Menu untuk mengonfirmasi bahwa item menu telah dihapus.

Apa yang dimaksud dengan tugas Cloud Run?

Tugas Cloud Run menjalankan container yang tidak melayani permintaan web, tetapi menjalankan tugas operasional atau pemrosesan data. Container akan menjalankan tugas dan keluar setelah selesai.

Tugas layanan pembersihan

Tugas layanan pembersihan akan mengambil item menu dalam status Gagal dan menghapusnya. Saat item menu baru dibuat, gambar dianalisis menggunakan Vision API untuk mendeteksi apakah itu item makanan atau bukan. Untuk gambar yang gagal dalam validasi ini, status item menu akan diperbarui menjadi Gagal, lalu dihapus oleh tugas pembersihan.

d74200f0bd14d350.png

Yang akan Anda pelajari

Di lab ini, Anda akan mempelajari cara melakukan hal-hal berikut:

  • Membuat tugas Cloud Run
  • Menjalankan tugas Cloud Run
  • Membuat tugas Cloud Scheduler
  • Memverifikasi eksekusi tugas

Prasyarat

  • Di lab ini, Anda dianggap telah memahami Konsol Cloud dan lingkungan shell.
  • Pengalaman Cloud Run dan Cloud Scheduler sebelumnya membantu, tetapi tidak diperlukan.

2. Penyiapan dan Persyaratan

Penyiapan Project Cloud

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak peduli tentang apa itu. Di sebagian besar codelab, Anda harus mereferensikan Project ID (biasanya diidentifikasi sebagai PROJECT_ID). Jika Anda tidak menyukai ID yang dihasilkan, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Penyiapan Lingkungan

Aktifkan Cloud Shell dengan mengklik ikon di sebelah kanan kotak penelusuran.

eb0157a992f16fa3.png

Dari Cloud Shell, jalankan perintah berikut untuk meng-clone kode aplikasi dari repo ini, lalu buka direktori yang berisi layanan menu:

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

Deploy layanan Menu menggunakan skrip penyiapan ke Cloud Run. Layanan Menu adalah microservice berbasis Java yang dibangun dengan framework Quarkus menggunakan database Cloud SQL Postgres sebagai backend-nya. Layanan Menu adalah dependensi runtime untuk tugas Cloud Run yang akan Anda buat pada langkah-langkah berikut.

./setup.sh

Deployment akan memerlukan waktu sekitar 10 menit untuk membuat semua komponen yang diperlukan.

Lanjutkan ke langkah berikutnya setelah menjalankan perintah di atas.

3. Mempelajari kode Tugas Cloud Run

Buka tab baru di Cloud Shell dengan mengklik ikon plus.

45f480cd1b9a995.pngS

Buka direktori yang berisi layanan pembersihan dan tinjau file yang membentuk tugas:

cd ~/cymbal-eats/cleanup-service

Layanan pembersihan dalam direktori ini berisi Dockerfile yang menentukan image container untuk tugas layanan pembersihan dengan dependensi yang diperlukan(httpie, jq).

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"]

Skrip pembersihan sebenarnya, yang tercantum di bawah, berisi perintah untuk mendapatkan daftar item menu dalam status gagal dan menghapusnya dengan melakukan panggilan API ke layanan Menu.

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

Perhatikan hal-hal berikut tentang skrip:

  • Variabel lingkungan FAILED_ITEM_AGE dan MENU_SERVICE_URL akan ditetapkan selama deployment dan diteruskan oleh tugas Cloud Run.
  • FAILED_ITEM_AGE - Jumlah menit sebelum item yang Gagal akan dihapus.
  • MENU_SERVICE_URL - URL layanan Cymbal Eats Menu.

4. Membuat Tugas Cloud Run

Selanjutnya, Anda akan membangun image container dan memublikasikannya ke Artifact Registry.

Image container ini akan digunakan untuk membuat tugas Cloud Run.

Mengaktifkan API layanan:

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

Menetapkan variabel lingkungan:

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

Buat repositori Artifact Registry baru guna menyimpan image Docker untuk tugas pembersihan:

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

Bangun image container menggunakan Cloud Build dan kirim image tersebut ke Artifact Registry dengan satu perintah:

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

Contoh output:

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

Setelah publikasi selesai, buka Artifact Registry dan tinjau image yang dipublikasikan:

fb95ae38baa7c543.png

Beralih kembali ke tab Cloud Shell kedua. Jalankan perintah berikut untuk menjelaskan layanan Menu dan menyimpan URL ke variabel lingkungan. Variabel lingkungan ini akan digunakan untuk mengonfigurasi tugas Cloud Run.

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

Buat tugas Cloud Run untuk membersihkan item menu yang gagal yang lebih dari 1 menit [ditetapkan oleh FAILED_ITEM_AGE].

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

Contoh output:

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.

Buka bagian TUGAS Cloud Run di konsol dan tinjau tugas yang dibuat.

Klik lowongan dan jelajahi tab yang tersedia: HISTORI, LOG, KONFIGURASI, dan YAML.

b12c8e312de3b66.png

Pastikan variabel lingkungan telah ditetapkan dengan meninjau bagian KONFIGURASI tugas di konsol:

724c2919d05349c8.pngS

(Opsional) Jika ingin mengubah variabel Failed Item Age atau Menu Service URL, setelah tugas Cloud Run dibuat, Anda dapat menggunakan perintah update:

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

Untuk memvalidasi tugas, jalankan tugas Cloud Run dengan menjalankan perintah berikut:

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

Contoh output:

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
 

Beralihlah ke tab LOGS untuk meninjau output tugas. Anda akan melihat Gagal Item Age dan Menu Service URL di log.

518cb00036a2561f.pngS

5. Menyiapkan Jadwal untuk Tugas Cloud Run

Cloud Scheduler adalah penjadwal cron job tingkat perusahaan yang terkelola sepenuhnya. Penjadwal ini memungkinkan Anda menjadwalkan hampir segala tugas, termasuk tugas batch, big data, operasi infrastruktur cloud, dan banyak lagi.

Salah satu praktik terbaik keamanan saat menggunakan tugas Cloud Scheduler adalah menjalankan setiap tugas dengan kredensial terpisah. Pada langkah ini, buat Akun layanan untuk digunakan oleh tugas penjadwal pembersihan.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Tugas Cloud Scheduler memerlukan izin untuk melakukan panggilan ke Tugas Cloud Run.

Beri peran Cloud Run Invoker ke akun layanan yang digunakan dalam tugas Cloud Scheduler:

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

Selanjutnya, Anda akan menyiapkan jadwal untuk menjalankan tugas layanan pembersihan.

Ada beberapa jenis target yang didukung oleh Cloud Scheduler.

  • HTTP
  • Pub/Sub
  • HTTP App Engine

Anda akan membuat tugas penjadwal menggunakan jenis target HTTP.

Untuk tujuan demonstrasi, Anda akan menjadwalkannya untuk dijalankan setiap 5 menit.

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

Tinjau parameter uri yang digunakan untuk memanggil Tugas Cloud Run:

  • REGION dan PROJECT_ID - Region Cloud Run dan Project ID tempat tugas layanan pembersihan di-deploy
  • cleanup-service - nama Tugas Cloud Run

Buka Cloud Scheduler di konsol untuk meninjau tugas scheduler yang dibuat:

3bc9120df7fc6ed.pngS

Tinjau opsi yang tersedia di bagian menu Tindakan.

7945908025dd2f2b.pngS

6. Menguji Tugas Cloud Run

Dengan menggunakan endpoint Layanan Menu, tinjau item menu yang ada dan statusnya:

curl ${MENU_SERVICE_URL}/menu | jq

Output:

Anda akan melihat 3 item menu dengan status Ready.

Ubah status item menu #1 menjadi Failed:

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

Tunggu 1 menit. Agar dihapus, item menu harus berusia 1 menit, seperti yang ditetapkan oleh parameter FAILED_ITEM_AGE.

Anda dapat menunggu operasi terjadwal berikutnya atau memaksa eksekusi tugas dari konsol.

Ada beberapa cara untuk memicu tugas, melalui UI atau dari command line.

Untuk contoh ini, jalankan perintah di Cloud Shell(Opsi #3) untuk memicu tugas.

  1. Dari Cloud Scheduler dengan memilih "Force a job run" dari menu Tindakan.

6c8cbeae6165ba4a.pngS

  1. Dari Cloud Run Job dengan mengklik "EXECUTE" tombol.

229c22288882b5c3.pngS

  1. Dari Cloud Shell dengan menjalankan perintah berikut:
gcloud beta run jobs execute cleanup-service --region=$REGION

Buka bagian Cloud Run JOBS, buka tab LOGS, lalu pastikan item menu telah dihapus.

50829ae27b135b2d.pngS

Filter log untuk "menghapus" kata kunci untuk menemukan log.

d94fb9e444b1c1b8.png

Gunakan endpoint Layanan Menu untuk memeriksa item menu yang ada melalui endpoint REST.

curl ${MENU_SERVICE_URL}/menu | jq

Output:

Anda akan melihat 2 item menu dengan status Ready.

7. Selamat!

Selamat, Anda telah menyelesaikan codelab!

Yang telah kita bahas:

  • Cara membuat tugas Cloud Run
  • Cara menjalankan tugas Cloud Run
  • Cara membuat tugas Cloud Scheduler
  • Cara memverifikasi eksekusi tugas

Langkah berikutnya:

Pelajari codelab Cymbal Eats lainnya:

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource, atau simpan project dan hapus resource satu per satu.

Menghapus project

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.