Aktywowanie zadań Cloud Run za pomocą usługi Cloud Scheduler

1. Omówienie

W tym module utworzysz zadanie Cloud Run i skonfigurujesz zadanie Cloud Scheduler. Wdrożysz usługę Cymbal Eats Menu za pomocą skryptu konfiguracji. Utworzysz zadanie Cloud Run, które będzie wykonywać wywołania interfejsu API usługi Cymbal Eats Menu. Wykonasz zadanie za pomocą interfejsu wiersza poleceń Google Cloud i skonfigurujesz jego harmonogram. Aby zweryfikować wykonanie, przejrzyj dzienniki i wywołaj usługę menu w celu potwierdzenia, że pozycje menu zostały usunięte.

Czym są zadania Cloud Run?

Zadanie Cloud Run uruchamia kontener, który nie obsługuje żądań sieciowych, ale wykonuje zadania operacyjne lub przetwarzanie danych. Kontener uruchomi zadanie i zamknie je po zakończeniu.

Zadanie usługi czyszczenia

Zadanie usługi czyszczenia pobierze pozycje menu o stanie „Niepowodzenie” i je usunie. Podczas tworzenia nowych pozycji menu obrazy są analizowane za pomocą interfejsu Vision API w celu określenia, czy jest to danie spożywcze. W przypadku obrazów, które nie przejdą weryfikacji, stan pozycji menu zostanie zmieniony na „Niepowodzenie”, a następnie usunięte przez zadanie czyszczenia.

d74200f0bd14d350.png

Czego się nauczysz

Z tego modułu nauczysz się:

  • Tworzenie zadań Cloud Run
  • Wykonywanie zadań Cloud Run
  • Tworzenie zadań usługi Cloud Scheduler
  • Sprawdź wykonanie zadań

Wymagania wstępne

  • W tym module zakładamy, że znasz środowisko Cloud Console i środowiska powłoki.
  • Wcześniejsze środowiska Cloud Run i Cloud Scheduler są przydatne, ale nie wymagane.

2. Konfiguracja i wymagania

Konfigurowanie projektu Cloud

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zmienić.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń z programowania konieczne jest odwołanie się do identyfikatora projektu (zwykle nazywa się on PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Potem nie będzie można go zmienić. Pozostanie ono przez czas trwania projektu.
  • Dostępna jest trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Aby wyłączyć zasoby, aby nie naliczać opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Konfiguracja środowiska

Aktywuj Cloud Shell, klikając ikonę po prawej stronie paska wyszukiwania.

eb0157a992f16fa3.png

W Cloud Shell uruchom to polecenie, aby sklonować kod aplikacji z tego repozytorium i przejść do katalogu zawierającego usługę menu:

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

Wdróż usługę Menu za pomocą skryptu konfiguracji w Cloud Run. Usługa Menu to oparty na Javie mikroserwis, który na potrzeby backendu korzysta z bazy danych Cloud SQL Postgres, na bazie platformy Quarkus. Usługa Menu jest zależnością w czasie działania dla zadania Cloud Run, które utworzysz w kolejnych krokach.

./setup.sh

Utworzenie wszystkich wymaganych komponentów zajmie około 10 minut.

Po wykonaniu powyższego polecenia przejdź do kolejnych kroków.

3. Zbadaj kod zadania Cloud Run

Otwórz nową kartę w Cloud Shell, klikając ikonę plusa.

45f480cd1b9a995.png

Przejdź do katalogu zawierającego usługę czyszczenia i przejrzyj pliki tworzące zadanie:

cd ~/cymbal-eats/cleanup-service

Usługa czyszczenia w tym katalogu zawiera element Dockerfile, który definiuje obraz kontenera na potrzeby zadania usługi czyszczenia z wymaganymi zależnościami(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"]

Wymieniony poniżej skrypt czyszczenia zawiera polecenia do pobrania listy elementów menu, w przypadku których wystąpiły błędy, i usuwania ich przez wywołania usługi Menu za pomocą wywołań interfejsu API.

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

Zwróć uwagę na te informacje o skrypcie:

  • Zmienne środowiskowe FAILED_ITEM_AGE i MENU_SERVICE_URL zostaną ustawione podczas wdrażania i przekazane przez zadanie Cloud Run.
  • FAILED_ITEM_AGE – liczba minut, po upływie których element, którego nie udało się przenieść, zostanie usunięty.
  • MENU_SERVICE_URL – adres URL usługi Cymbal Eats Menu.

4. Tworzenie zadania Cloud Run

Teraz utworzysz obraz kontenera i opublikujesz go w Artifact Registry.

Ten obraz kontenera zostanie użyty do utworzenia zadania Cloud Run.

Włącz interfejsy API usług:

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

Ustaw zmienne środowiskowe:

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

Utwórz nowe repozytorium Artifact Registry do przechowywania obrazów Dockera na potrzeby zadania czyszczenia:

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

Utwórz obraz kontenera za pomocą Cloud Build i przekaż go do Artifact Registry za pomocą jednego polecenia:

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

Przykładowe dane wyjściowe:

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

Po opublikowaniu otwórz Artifact Registry i sprawdź opublikowany obraz:

fb95ae38baa7c543.png

Wróć na drugą kartę Cloud Shell. Uruchom poniższe polecenie, aby opisać usługę menu i zapisać adres URL w zmiennej środowiskowej. Ta zmienna środowiskowa będzie używana do konfigurowania zadania Cloud Run.

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

Utwórz zadanie Cloud Run, aby usunąć nieudane elementy menu, które są starsze niż 1 minutę [ustawione przez: 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

Przykładowe dane wyjściowe:

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.

Otwórz w konsoli sekcję ZADANIA Cloud Run i sprawdź utworzone zadanie.

Kliknij zadanie i przejrzyj dostępne karty: HISTORY, LOGS, CONFIGURATION i YAML.

b12c8e312de3b66.png

Sprawdź, czy zmienne środowiskowe zostały ustawione, sprawdzając sekcję CONFIGURATION w konsoli:

724c2919d05349c8.png

(Opcjonalnie) Jeśli chcesz zmienić zmienne Wiek elementu lub adresu URL usługi menu, których nie udało się zmienić, po utworzeniu zadania Cloud Run możesz użyć polecenia 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

Aby sprawdzić zadanie, uruchom je, uruchamiając to polecenie:

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

Przykładowe dane wyjściowe:

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
 

Otwórz kartę LOGS, aby sprawdzić dane wyjściowe zadania. W dziennikach powinny pojawić się błędy dotyczące wieku elementu i adresu URL usługi menu.

518cb00036a2561f.png

5. Skonfiguruj harmonogram zadania Cloud Run

Cloud Scheduler to w pełni zarządzane narzędzie do planowania zadań cron dla firm. Pozwala zaplanować praktycznie dowolne zadania, w tym zadania wsadowe, zadania big data, operacje w infrastrukturze w chmurze i inne.

Jedną ze sprawdzonych metod w zakresie bezpieczeństwa podczas pracy z zadaniem usługi Cloud Scheduler jest wykonanie każdego zadania za pomocą oddzielnych danych logowania. W tym kroku utworzysz konto usługi, które będzie używane przez zadanie algorytmu szeregowania czyszczenia.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Zadanie Cloud Scheduler wymaga uprawnień do wywoływania zadań Cloud Run.

Przypisz rolę Cloud Run Invoker do konta usługi używanego w zadaniu usługi Cloud Scheduler:

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

Następnie skonfigurujesz harmonogram uruchamiania zadania usługi czyszczenia.

Usługa Cloud Scheduler obsługuje wiele typów celów.

  • HTTP
  • Pub/Sub
  • App Engine HTTP

Utworzysz zadanie algorytmu szeregowania z użyciem typu docelowego HTTP.

Dla celów demonstracyjnych zaplanujesz jego uruchamianie co 5 minut.

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

Sprawdź parametr uri używany do wywoływania zadania Cloud Run:

  • REGION i PROJECT_ID – region Cloud Run i identyfikator projektu, w których zostało wdrożone zadanie usługi czyszczenia
  • cleanup-service – nazwa zadania Cloud Run

W konsoli otwórz Cloud Scheduler, aby sprawdzić utworzone zadanie algorytmu szeregowania:

3bc9120df7fc6ed.png

Sprawdź opcje dostępne w menu Działania.

7945908025dd2f2b.png

6. Testowanie zadania Cloud Run

Za pomocą punktów końcowych usługi menu przejrzyj istniejące pozycje menu i ich stan:

curl ${MENU_SERVICE_URL}/menu | jq

Dane wyjściowe:

Zobaczysz 3 pozycje menu w stanie „Ready”.

Zmień stan pozycji menu nr 1 na Failed:

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

Odczekaj minutę. Aby można było usunąć pozycję menu, musi ona mieć 1 minutę, zgodnie z wartością ustawioną przez parametr FAILED_ITEM_AGE.

Możesz zaczekać na następne zaplanowane uruchomienie lub wymusić wykonanie zadania za pomocą konsoli.

Zadanie można aktywować na kilka sposobów – za pomocą interfejsu użytkownika lub wiersza poleceń.

W tym przykładzie, aby aktywować zadanie, uruchom polecenie w Cloud Shell(opcja 3).

  1. W Cloud Scheduler wybierz opcję „Wymuś uruchomienie zadania”. w menu Czynności.

6c8cbeae6165ba4a.png

  1. W sekcji Zadanie Cloud Run kliknij „EXECUTE” (WYKONAJ”. Przycisk

229c22288882b5c3.png

  1. W Cloud Shell uruchom to polecenie:
gcloud beta run jobs execute cleanup-service --region=$REGION

Przejdź do sekcji ZADANIA w Cloud Run, otwórz kartę LOGS (LOGS) i sprawdź, czy element menu został usunięty.

50829ae27b135b2d.png

Przefiltruj dzienniki pod kątem „usuwania” słowa kluczowego, aby znaleźć dzienniki.

d94fb9e444b1c1b8.png

Użyj punktów końcowych usługi menu, aby sprawdzić istniejące pozycje menu za pomocą punktu końcowego REST.

curl ${MENU_SERVICE_URL}/menu | jq

Dane wyjściowe:

W stanie „Ready” zobaczysz 2 pozycje menu.

7. Gratulacje!

Gratulacje. Udało Ci się ukończyć ćwiczenia z programowania.

Omówione zagadnienia:

  • Jak tworzyć zadania Cloud Run
  • Jak wykonywać zadania Cloud Run
  • Jak tworzyć zadania usługi Cloud Scheduler
  • Jak sprawdzić wykonanie zadań

Co dalej:

Poznaj inne ćwiczenia z programowania Cymbal Eats:

Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym samouczku, możesz usunąć projekt zawierający te zasoby lub zachować projekt i usunąć poszczególne zasoby.

Usuwam projekt

Najprostszym sposobem na uniknięcie płatności jest usunięcie projektu utworzonego na potrzeby samouczka.