1. Wprowadzenie

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 powiązane i rozproszone. Zajmuje się pozyskiwaniem, dostarczaniem, zabezpieczeniami, autoryzacją i obsługą błędów.
Workflows to w pełni zarządzana platforma do administracji, która wykonuje usługi w zdefiniowanej przez Ciebie kolejności, czyli w przepływie 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 tym module utworzysz sterowanie mikroserwisami oparte na zdarzeniach, aby przetwarzać obrazy. Do koordynowania kolejności, danych wejściowych i wyjściowych 4 funkcji Cloud Functions do przetwarzania obrazów użyjesz przepływów pracy. Następnie włączysz orkiestrację, aby reagować na zdarzenia Cloud Storage w luźno powiązany sposób za pomocą Eventarc.
Ostatecznie uzyskasz elastyczną, ale uporządkowaną architekturę bezserwerową do przetwarzania obrazów.

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 reagował na zdarzenia Cloud Storage za pomocą Eventarc
2. Konfiguracja i wymagania
Samodzielne konfigurowanie środowiska
- Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail lub Google Workspace, musisz je utworzyć.



- Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
- Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako
PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu. - Warto wiedzieć, że istnieje trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
- Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego laboratorium nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.
Uruchamianie Cloud Shell
Z Google Cloud można korzystać zdalnie na laptopie, ale w tym module praktycznym będziesz używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.
W konsoli Google Cloud kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

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

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Wszystkie zadania w tym laboratorium możesz wykonać 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. Dostępne regiony znajdziesz w artykule 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 w 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 następująca:

- Obraz jest zapisywany w zasobniku wejściowym, który generuje zdarzenie utworzenia Cloud Storage.
- Zdarzenie tworzenia Cloud Storage jest odczytywane przez Eventarc za pomocą aktywatora Cloud Storage i przekazywane do Workflows jako CloudEvent.
- W pierwszym kroku przepływu pracy, Filtruj, usługa Cloud Functions korzysta z interfejsu Vision API, aby określić, czy obraz jest bezpieczny. Jeśli obraz jest bezpieczny, Workflows przechodzi do następnych kroków.
- W drugim kroku procesu, Labeler, usługa Cloud Functions, wyodrębnia etykiety obrazu za pomocą interfejsu Vision API i zapisuje je w zasobniku wyjściowym.
- W trzecim kroku Resizer, kolejna usługa Cloud Functions, zmienia rozmiar obrazu za pomocą ImageSharp i zapisuje go w zasobniku wyjściowym.
- W ostatnim kroku Watermarker, kolejna usługa Cloud Functions, dodaje znak wodny z etykietami z usługi Labeler do obrazu o zmienionym rozmiarze za pomocą ImageSharp i zapisuje obraz w zasobniku wyjściowym.
Aplikacja jest aktywowana przez zdarzenie Cloud Storage, dlatego jest sterowana zdarzeniami. Przetwarzanie obrazów odbywa się w ramach przepływu pracy, dlatego jest to orkiestracja. Jest to oparte na zdarzeniach orkiestrowanie elastycznej, ale uporządkowanej architektury bezserwerowej do przetwarzania obrazów.
4. Tworzenie zasobników
Utwórz zasobnik wejściowy, do którego użytkownicy będą przesyłać obrazy, oraz zasobnik wyjściowy, w którym potok przetwarzania obrazów będzie zapisywać przetworzone obrazy.
Uruchom to polecenie w Cloud Shell:
REGION=us-central1 BUCKET1=$PROJECT_ID-images-input-$RANDOM BUCKET2=$PROJECT_ID-images-output-$RANDOM gsutil mb -l $REGION gs://$BUCKET1 gsutil mb -l $REGION gs://$BUCKET2
5. Wdrażanie usługi filtrowania
Zacznijmy od wdrożenia pierwszej usługi. Ta usługa Cloud Functions otrzymuje informacje o zasobniku i pliku, sprawdza, czy obraz jest bezpieczny, korzystając z interfejsu Vision API, i zwraca wynik.
Najpierw włącz wymagane usługi dla Cloud Functions 2 generacji i interfejsu Vision API:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ run.googleapis.com \ vision.googleapis.com
W folderze najwyższego poziomu processing-pipelines 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. Będzie on potrzebny później:
FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
6. Wdróż usługę osób oznaczających etykietami
Druga usługa 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 najwyższego poziomu processing-pipelines 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. Będzie on potrzebny później:
LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
7. Wdrażanie usługi zmiany rozmiaru
Ta usługa Cloud Functions otrzymuje informacje o zasobniku i pliku, zmienia rozmiar obrazu za pomocą biblioteki ImageSharp i zapisuje obraz w zasobniku wyjściowym.
W folderze najwyższego poziomu processing-pipelines 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 funkcja zmiany rozmiaru miała więcej czasu na przetworzenie.
Po wdrożeniu funkcji ustaw adres URL usługi w zmiennej. Będzie on potrzebny później:
RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
8. Wdróż usługę znakowania wodnego
Ta usługa 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 najwyższego poziomu processing-pipelines 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. Będzie on potrzebny później:
WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
W tym momencie wszystkie 4 funkcje Cloud Functions powinny być wdrożone i działać:

9. Definiowanie i wdrażanie przepływu pracy
Użyj przepływów pracy, aby połączyć usługi filtrowania, etykietowania, zmiany rozmiaru i dodawania znaku wodnego w jeden przepływ pracy. Przepływy pracy będą koordynować wywoływanie tych usług w kolejności i z parametrami, które określimy.
Najpierw włącz wymagane usługi dla przepływów pracy:
gcloud services enable \ workflows.googleapis.com \ workflowexecutions.googleapis.com
Zdefiniuj
Workflows otrzymuje CloudEvent jako parametr. Będzie on pochodzić z Eventarc po utworzeniu aktywatora. W pierwszych 2 krokach przepływy pracy rejestrują zdarzenie i wyodrębniają z niego 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 przepływy pracy wywołują usługę filtrowania, którą wdrożyliśmy wcześniej. Następnie rejestruje i sprawdza bezpieczeństwo pliku:
- 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 label kroku przepływy pracy wywołują usługę etykietowania i przechwytują odpowiedź (3 najważniejsze 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ę zmiany rozmiaru i rejestruje odpowiedź (zasobnik i plik obrazu o zmienionym rozmiarze):
- resize:
call: http.post
args:
url: RESIZER_URL # TODO: Replace
auth:
type: OIDC
body:
bucket: ${bucket}
file: ${file}
result: resizeResponse
W kroku watermark przepływy pracy wywołują usługę znaku wodnego z obrazem o zmienionym rozmiarze i etykietami oraz rejestrują wynik (obraz o zmienionym rozmiarze 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 usługa Workflows zwraca kod stanu HTTP z usług etykietowania, zmiany rozmiaru i dodawania znaku wodnego:
- final:
return:
label: ${labelResponse.code}
resize: ${resizeResponse.code}
watermark: ${watermarkResponse.code}
Wdróż
Zanim wdrożysz przepływ pracy, upewnij się, że adresy URL usług zostały zastąpione adresami URL wdrożonych funkcji ręcznie lub za pomocą sed:
W folderze najwyższego poziomu processing-pipelines przejdź do folderu image-v3, w którym znajduje się plik workflows.yaml:
cd image-v3/
Uruchom sed, aby zastąpić adresy URL symboli zastępczych 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
Po kilku sekundach w konsoli powinien pojawić się wdrożony przepływ pracy:

10. Utwórz aktywator
Po wdrożeniu przepływu pracy ostatnim krokiem jest połączenie go ze zdarzeniami Cloud Storage za pomocą aktywatora Eventarc.
Konfiguracja jednorazowa
Najpierw włącz wymagane usługi Eventarc:
gcloud services enable \ eventarc.googleapis.com
Utwórz konto usługi, które będzie używane 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 można było używać konta usługi do wywoływania przepływów pracy z Eventarc:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/workflows.invoker \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
Przypisz rolę eventarc.eventReceiver, aby można było używać konta usługi 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 w przypadku aktywatora 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 utworzenia nowego pliku 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 widać, że aktywator został utworzony i jest gotowy:

11. Testowanie potoku
Potok przetwarzania obrazów 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, powinna się pojawić aktywna instancja wykonania przepływu pracy:

Po około minucie powinna pojawić się informacja o udanym wykonaniu. Możesz też wyświetlić dane wejściowe i wyjściowe przepływu pracy:

Jeśli wyświetlisz zawartość zasobnika wyjściowego, zobaczysz zmieniony rozmiar obrazu, zmieniony rozmiar obrazu ze znakiem wodnym i etykiety obrazu:
gsutil ls gs://$BUCKET2 gs://$PROJECT_ID-images-output-$RANDOM/beach-400x400-watermark.jpeg gs://$PROJECT_ID-images-output-$RANDOM/beach-400x400.png gs://$PROJECT_ID-images-output-$RANDOM/beach-labels.txt
Aby sprawdzić, czy wszystko się zgadza, otwórz obraz po zmianie rozmiaru i dodaniu znaku wodnego:

12. Gratulacje
Gratulacje! Codelab został ukończony.
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 reagował na zdarzenia Cloud Storage za pomocą Eventarc