Tworzenie administracji opartej na zdarzeniach za pomocą Eventarc i Workflows

1. Wprowadzenie

cb762f29e9183a3f.png 1c05e3d0c2bd2b45.png a03f943ca09ac4c.png

Eventarc ułatwia łączenie usług Cloud Run ze zdarzeniami z różnych źródeł. Umożliwia tworzenie architektur opartych na zdarzeniach, w których mikroserwisy są luźno sprzężone i rozproszone. Zajmuje się pozyskiwaniem, dostarczaniem, zabezpieczeniami, autoryzacją i obsługą błędów związanych ze zdarzeniami.

Przepływy pracy to w pełni zarządzana platforma do administrowania, która wykonuje usługi w zdefiniowanej przez Ciebie kolejności: przepływ pracy. Te przepływy pracy mogą łączyć usługi hostowane w Cloud Run lub Cloud Functions, usługi Google Cloud, takie jak Cloud Vision AI i BigQuery, oraz dowolny interfejs API oparty na protokole HTTP.

W ramach tego ćwiczenia w Codelabs utworzysz opartą na zdarzeniach administrację mikroserwisów do przetwarzania obrazów. Za pomocą Workflows będziesz administrować kolejnością, danymi wejściowymi i wyjściowymi 4 funkcji przetwarzania obrazów przez Cloud Functions. Następnie włączysz obsługę administracyjną w celu reagowania na zdarzenia Cloud Storage w luźno połączony sposób z Eventarc.

W ostatecznym rozrachunku otrzymasz elastyczną i ustrukturyzowaną architekturę bezserwerową do przetwarzania obrazów.

e372ceed8c26c5fb.png

Czego się nauczysz

  • Omówienie Eventarc i Workflows
  • Jak wdrażać usługi Cloud Functions
  • Jak administrować usługami za pomocą Workflows
  • Jak sprawić, aby Workflows odpowiadały na zdarzenia Cloud Storage za pomocą Eventarc

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  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.

Uruchamianie Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w ramach tego ćwiczenia z programowania wykorzystasz Google Cloud Shell – środowisko wiersza poleceń działające w chmurze.

W konsoli Google Cloud kliknij ikonę Cloud Shell na górnym pasku narzędzi:

55efc1aaa7a4d3ad.png

Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po zakończeniu powinno pojawić się coś takiego:

7ffe5cbb04455448.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, znacząco zwiększając wydajność sieci i uwierzytelnianie. Wszystkie zadania w ramach tego ćwiczenia z programowania można wykonywać w przeglądarce. Nie musisz niczego instalować.

Konfigurowanie gcloud

W Cloud Shell ustaw identyfikator projektu i region, w którym chcesz wdrożyć aplikację. Zapisz je jako zmienne PROJECT_ID i REGION. Informacje o dostępnych regionach znajdziesz w sekcji Lokalizacje Cloud Functions.

PROJECT_ID=your-project-id
gcloud config set project $PROJECT_ID

Pobieranie kodu źródłowego

Kod źródłowy aplikacji znajduje się w folderze processing-pipelines repozytorium eventarc-samples.

Sklonuj repozytorium:

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

Przejdź do folderu eventarc-samples/processing-pipelines:

cd eventarc-samples/processing-pipelines

3. Omówienie architektury

Architektura aplikacji jest taka:

6aa6fbc7721dd6b6.png

  1. Obraz jest zapisywany w zasobniku wejściowym, który generuje zdarzenie utworzenia w Cloud Storage.
  2. Zdarzenie utworzenia w Cloud Storage jest odczytywane przez Eventarc przez aktywator Cloud Storage i przekazywane do Workflows jako CloudEvent.
  3. W pierwszym kroku procedury Filtruj (usługa w Cloud Functions) używa interfejsu Vision API, aby określić, czy obraz jest bezpieczny. Jeśli obraz jest bezpieczny, Workflows będzie kontynuować w następnych krokach.
  4. W drugim kroku przepływu pracy funkcja Labeler w Cloud Functions wyodrębnia etykiety obrazu za pomocą interfejsu Vision API i zapisuje je w zasobniku wyjściowym.
  5. W trzecim kroku inna usługa funkcji w Cloud Functions, Resizer, zmienia rozmiar obrazu za pomocą ImageSharp i zapisuje powiększony obraz w zasobniku wyjściowym.
  6. W ostatnim kroku inna usługa Cloud Functions (Watermarker) dodaje znak wodny etykiet z narzędzia Labeler do zmniejszonego rozmiaru obrazu za pomocą ImageSharp i zapisuje obraz w zasobniku wyjściowym.

Aplikacja jest aktywowana przez zdarzenie Cloud Storage, dlatego jest oparta na zdarzeniach. Przetwarzanie obrazów odbywa się w ramach przepływu pracy, więc mamy do czynienia z administracją. Ostatecznie jest to administracja oparta na zdarzeniach zapewniająca elastyczną i uporządkowaną architekturę bezserwerową przetwarzającą obrazy.

4. Tworzenie zasobników

Utwórz zasobnik wejściowy, do którego użytkownicy mogą przesyłać obrazy, oraz zasobnik wyjściowy dla potoku przetwarzania obrazów, który pozwoli zapisać przetworzone obrazy.

Uruchom to polecenie w Cloud Shell:

REGION=us-central1
BUCKET1=$PROJECT_ID-images-input
BUCKET2=$PROJECT_ID-images-output

gsutil mb -l $REGION gs://$BUCKET1
gsutil mb -l $REGION gs://$BUCKET2

5. Wdróż usługę filtra

Zacznijmy od wdrożenia pierwszej usługi. Ta usługa Cloud Functions otrzymuje informacje o zasobniku i pliku, określa, czy obraz jest bezpieczny w Vision API, i zwraca wynik.

Najpierw włącz wymagane usługi w Cloud Functions gen2 i interfejsie Vision API:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  cloudfunctions.googleapis.com \
  run.googleapis.com \
  vision.googleapis.com

W folderze processing-pipelines najwyższego poziomu wdróż usługę:

SERVICE_NAME=filter

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --entry-point Filter.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v3/filter/csharp

Po wdrożeniu funkcji ustaw adres URL usługi w zmiennej, która będzie potrzebna później:

FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

6. Wdrażanie usługi oznaczania etykietami

Druga usługa w Cloud Functions otrzymuje informacje o zasobniku i pliku, wyodrębnia etykiety obrazu za pomocą interfejsu Vision API i zapisuje je w zasobniku wyjściowym.

W folderze processing-pipelines najwyższego poziomu wdróż usługę:

SERVICE_NAME=labeler

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Labeler.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/labeler/csharp

Po wdrożeniu funkcji ustaw adres URL usługi w zmiennej, która będzie potrzebna później:

LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

7. Wdróż usługę zmiany rozmiaru

Ta usługa w Cloud Functions otrzymuje informacje o zasobniku i pliku, zmienia rozmiar obrazu za pomocą ImageSharp i zapisuje obraz w zasobniku wyjściowym.

W folderze processing-pipelines najwyższego poziomu wdróż usługę:

SERVICE_NAME=resizer

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Resizer.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/resizer/csharp \
  --timeout=120s

Zwróć uwagę na wartość timeout wynoszącą 2 minuty, aby dać funkcji zmiany rozmiaru więcej czasu na przetworzenie.

Po wdrożeniu funkcji ustaw adres URL usługi w zmiennej, która będzie potrzebna później:

RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

8. Wdróż usługę znaku wodnego

Ta usługa w Cloud Functions otrzymuje informacje o zasobniku, pliku i etykietach, odczytuje plik, dodaje etykiety jako znak wodny do obrazu za pomocą ImageSharp i zapisuje obraz w zasobniku wyjściowym.

W folderze processing-pipelines najwyższego poziomu wdróż usługę:

SERVICE_NAME=watermarker

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Watermarker.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/watermarker/csharp

Po wdrożeniu funkcji ustaw adres URL usługi w zmiennej, która będzie potrzebna później:

WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

W tym momencie powinny być wdrożone i uruchomione wszystkie 4 funkcje w Cloud Functions:

76a218568982c90c.png

9. Definiowanie i wdrażanie przepływu pracy

Korzystaj z Workflows, aby połączyć w przepływ pracy usługi filtrowania, oznaczania etykietami, zmiany rozmiaru i znaku wodnego. Przepływy pracy będą administrować wywoływaniem tych usług w kolejności i z użyciem zdefiniowanych przez nas parametrów.

Najpierw włącz wymagane usługi dla Workflows:

gcloud services enable \
  workflows.googleapis.com \
  workflowexecutions.googleapis.com

Zdefiniuj

Przepływy pracy odbierają zdarzenie CloudEvent jako parametr. Będzie ona pobierana z Eventarc, gdy utworzymy aktywator. W pierwszych 2 krokach Workflows rejestruje zdarzenie i wyodrębnia ze zdarzenia informacje o zasobniku i pliku:

main:
  params: [event]
  steps:
  - log_event:
      call: sys.log
      args:
          text: ${event}
          severity: INFO
  - extract_bucket_and_file:
      assign:
      - bucket: ${event.data.bucket}
      - file: ${event.data.name}

W kroku filter usługa Workflows wywołuje wdrożoną wcześniej usługę filtra. Następnie rejestruje i sprawdza bezpieczeństwo plików:

  - filter:
      call: http.post
      args:
        url: FILTER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: filterResponse
  - log_safety:
      call: sys.log
      args:
          text: ${filterResponse.body.safe}
          severity: INFO
  - check_safety:
      switch:
        - condition: ${filterResponse.body.safe == true}
          next: label
      next: end

W kroku label usługa Workflows wywołuje usługę osoby oznaczającej etykietami i przechwytuje odpowiedź (3 pierwsze etykiety):

  - label:
      call: http.post
      args:
        url: LABELER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: labelResponse

W kroku resize Workflows wywołuje usługę do zmiany rozmiaru i przechwytuje odpowiedź (zasobnik i plik po zmianie rozmiaru obrazu):

  - resize:
      call: http.post
      args:
        url: RESIZER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: resizeResponse

W kroku watermark Workflows wywołuje usługę znaku wodnego z zmienionym rozmiarem obrazu i etykietami oraz zapisuje wynik (obraz ze zmienionym rozmiarem i ze znakiem wodnym):

  - watermark:
      call: http.post
      args:
        url: WATERMARKER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${resizeResponse.body.bucket}
            file: ${resizeResponse.body.file}
            labels: ${labelResponse.body.labels}
      result: watermarkResponse

W kroku final przepływy pracy zwracają kod stanu HTTP z usług umożliwiających oznaczanie etykietami, narzędzia do zmiany rozmiaru i narzędzia do dodawania znaków wodnych:

  - final:
      return:
        label: ${labelResponse.code}
        resize: ${resizeResponse.code}
        watermark: ${watermarkResponse.code}

Wdróż

Przed wdrożeniem przepływu pracy upewnij się, że adresy URL usług zostały zastąpione adresami URL wdrożonych funkcji (ręcznie lub za pomocą narzędzia sed):

W folderze processing-pipelines najwyższego poziomu otwórz folder image-v3, w którym znajduje się workflows.yaml plik:

cd image-v3/

Uruchom sed, aby zastąpić zastępcze adresy URL rzeczywistymi adresami URL wdrożonych usług:

sed -i -e "s|FILTER_URL|${FILTER_URL}|" workflow.yaml
sed -i -e "s|LABELER_URL|${LABELER_URL}|" workflow.yaml
sed -i -e "s|RESIZER_URL|${RESIZER_URL}|" workflow.yaml
sed -i -e "s|WATERMARKER_URL|${WATERMARKER_URL}|" workflow.yaml

Wdróż przepływ pracy:

WORKFLOW_NAME=image-processing

gcloud workflows deploy $WORKFLOW_NAME \
    --source=workflow.yaml \
    --location=$REGION

Za kilka sekund w konsoli powinien pojawić się przepływ pracy wdrożony w konsoli:

92cf4e758bdc3dde.png

10. Utwórz aktywator

Ostatnim krokiem po wdrożeniu przepływu pracy jest połączenie go ze zdarzeniami Cloud Storage za pomocą aktywatora Eventarc.

Konfiguracja jednorazowa

Najpierw włącz wymagane usługi dla Eventarc:

gcloud services enable \
 eventarc.googleapis.com

Utwórz konto usługi, którego będziesz używać w aktywatorze Eventarc.

SERVICE_ACCOUNT=eventarc-trigger-imageproc-sa

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Eventarc trigger image processing service account"

Przypisz rolę workflows.invoker, aby konto usługi mogło być używane do wywoływania Workflows z Eventarc:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/workflows.invoker \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Przyznaj rolę eventarc.eventReceiver, jeśli konto usługi może być używane w

Aktywator Cloud Storage:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/eventarc.eventReceiver \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Przypisz rolę pubsub.publisher do konta usługi Cloud Storage. Jest to wymagane przez aktywator Cloud Storage Eventarc:

STORAGE_SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p $PROJECT_ID)"

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$STORAGE_SERVICE_ACCOUNT \
    --role roles/pubsub.publisher

Utwórz

Aby utworzyć aktywator, uruchom to polecenie. Ten aktywator filtruje zdarzenia tworzenia nowych plików z wejściowego zasobnika Cloud Storage i przekazuje je do zdefiniowanego wcześniej przepływu pracy:

TRIGGER_NAME=trigger-image-processing

gcloud eventarc triggers create $TRIGGER_NAME \
  --location=$REGION \
  --destination-workflow=$WORKFLOW_NAME \
  --destination-workflow-location=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=$BUCKET1" \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

W sekcji Eventarc w konsoli Cloud możesz zobaczyć, że aktywator został utworzony i gotowy:

14330c4fa2451bc0.png

11. Testowanie potoku

Potok przetwarzania obrazu jest gotowy do odbierania zdarzeń z Cloud Storage. Aby przetestować potok, prześlij obraz do zasobnika wejściowego:

gsutil cp beach.jpg gs://$BUCKET1

Gdy tylko prześlesz zdjęcie, wykonanie procesu Workflows powinno być aktywne:

36d07cb63c39e7d9.png

Po około minucie powinno zacząć się zakończyć powodzeniem. Możesz też wyświetlić dane wejściowe i wyjściowe przepływu pracy:

229200c79d989c25.png

Po wyświetleniu listy zawartości zasobnika wyjściowego powinny być widoczne zmienione rozmiary obrazu, obraz ze zmienionym rozmiarem i ze znakiem wodnym oraz etykiety obrazu:

gsutil ls gs://$BUCKET2

gs://$PROJECT_ID-images-output/beach-400x400-watermark.jpeg
gs://$PROJECT_ID-images-output/beach-400x400.png
gs://$PROJECT_ID-images-output/beach-labels.txt

Aby dokładnie sprawdzić efekt, otwórz obraz ze zmienionym rozmiarem i ze znakiem wodnym:

75f3c0019ca842ce.jpeg

12. Gratulacje

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

Omówione zagadnienia

  • Omówienie Eventarc i Workflows
  • Jak wdrażać usługi Cloud Functions
  • Jak administrować usługami za pomocą Workflows
  • Jak sprawić, aby Workflows odpowiadały na zdarzenia Cloud Storage za pomocą Eventarc