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 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.
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
- 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ć.
- 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.
- 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:
Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po zakończeniu powinno pojawić się coś takiego:
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:
- Obraz jest zapisywany w zasobniku wejściowym, który generuje zdarzenie utworzenia w Cloud Storage.
- Zdarzenie utworzenia w Cloud Storage jest odczytywane przez Eventarc przez aktywator Cloud Storage i przekazywane do Workflows jako CloudEvent.
- 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.
- 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.
- 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.
- 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:
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:
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:
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:
Po około minucie powinno zacząć się zakończyć powodzeniem. Możesz też wyświetlić dane wejściowe i wyjściowe przepływu pracy:
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:
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