Zdjęcia codziennie: moduł 5 – czyszczenie po usunięciu obrazu

Zdjęcia codziennie:
moduł 5 – czyszczenie po usunięciu obrazu

Informacje o tym ćwiczeniu (w Codelabs)

subjectOstatnia aktualizacja: paź 7, 2021
account_circleAutorzy: Mete Atamel

1. Omówienie

W tym module z kodem utworzysz nową usługę Cloud Run – kolektor pamięci masowej obrazu, która zostanie aktywowana przez Eventarc, nową usługę do odbierania zdarzeń w Cloud Run. Gdy zdjęcie zostanie usunięte z zasobnika zdjęć, usługa otrzyma zdarzenie z Eventarc. Następnie usuwa obraz z zasobnika miniatur oraz usuwa go z kolekcji obrazów Firestore.

d93345bfc235f81e.png

Czego się nauczysz

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • 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ć.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google i w każdej chwili możesz go zaktualizować.
  • Identyfikator projektu musi być unikalny we wszystkich projektach Google Cloud i nie można go zmienić (nie można go zmienić po ustawieniu). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz odwoływać się do identyfikatora projektu (który zwykle nazywa się PROJECT_ID), więc jeśli Ci się nie podoba, wygeneruj kolejny losowy kod lub wypróbuj swój własny i sprawdź, czy jest dostępny. Potem urządzenie jest „zawieszone”. po utworzeniu projektu.
  • Występuje trzecia wartość – numer projektu – używany przez 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 konsoli Cloud, aby móc korzystać z zasobów i interfejsów API Cloud. 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, wykonaj czynności „wyczyść” znajdziesz na końcu tego ćwiczenia. 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 Cloud.

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

bce75f34b2c53987.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:

f6ef2b5f13479f3a.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 tym module możesz wykonać w przeglądarce.

3. Wprowadzenie do Eventarc

Eventarc ułatwia łączenie usług Cloud Run ze zdarzeniami z różnych źródeł. Zajmuje się pozyskiwaniem, dostarczaniem, zabezpieczeniami, autoryzacją i obsługą błędów związanych ze zdarzeniami.

776ed63706ca9683.png

Możesz rysować zdarzenia ze źródeł Google Cloud i aplikacji niestandardowych publikujących w Cloud Pub/Sub oraz dostarczać je do ujść Google Cloud Run.

Zdarzenia z wielu źródeł Google Cloud są dostarczane za pomocą logów kontrolnych Cloud. Czas oczekiwania i dostępność dostarczania zdarzeń z tych źródeł są powiązane z logami kontrolnymi Cloud. Po wywołaniu zdarzenia ze źródła Google Cloud tworzony jest odpowiedni wpis w logu kontrolnym Cloud.

Aplikacje niestandardowe publikujące w Cloud Pub/Sub mogą publikować wiadomości w określonym przez siebie temacie Pub/Sub w dowolnym formacie.

Aktywatory zdarzeń to mechanizm filtrujący zdarzenia, które mają być dostarczone do danego ujścia.

Wszystkie zdarzenia są dostarczane w formacie CloudEvents v1.0, co zapewnia interoperacyjność między usługami.

4. Zanim zaczniesz

Włącz interfejsy API

Do aktywowania usługi Cloud Run potrzebujesz usługi Eventarc. Upewnij się, że jest włączona:

gcloud services enable eventarc.googleapis.com

Powinna pojawić się operacja dokończenia:

Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.

Skonfiguruj konta usługi

W aktywatorach będzie używane domyślne konto usługi Compute. Przypisz rolę eventarc.eventReceiver do domyślnego konta usługi Compute:

PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
    --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
    --role roles/eventarc.eventReceiver

Przypisz rolę pubsub.publisher do konta usługi Cloud Storage. Jest to wymagane w przypadku aktywatora Eventarc w Cloud Storage:

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

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

Jeśli konto usługi Pub/Sub zostało włączone 8 kwietnia 2021 r. lub wcześniej, przypisz rolę iam.serviceAccountTokenCreator do konta usługi Pub/Sub:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

5. Klonowanie kodu

Skopiuj kod, jeśli jeszcze nie udało Ci się tego zrobić w poprzednim module:

git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop

Następnie możesz przejść do katalogu zawierającego usługę:

cd serverless-photosharing-workshop/services/garbage-collector/nodejs

Masz do dyspozycji taki układ plików dla usługi:

services
 |
 ├── garbage-collector
      |
      ├── nodejs
           |
           ├── index.js
           ├── package.json

W folderze znajdują się 3 pliki:

  • index.js zawiera kod Node.js
  • package.json definiuje zależności biblioteki

6. Zapoznaj się z kodem

Zależności

Plik package.json określa potrzebne zależności biblioteki:

{
 
"name": "garbage_collector_service",
 
"version": "0.0.1",
 
"main": "index.js",
 
"scripts": {
   
"start": "node index.js"
 
},
 
"dependencies": {
   
"cloudevents": "^4.0.1",
   
"express": "^4.17.1",
   
"@google/events": "^3.1.0",
   
"@google-cloud/firestore": "^4.9.9",
   
"@google-cloud/storage": "^5.8.3"
 
}
}

Przy usuwaniu obrazów z Cloud Storage polegamy na bibliotece Cloud Storage. Deklarujemy zależność od Cloud Firestore, aby usunąć również zapisane wcześniej metadane obrazu. Dodatkowo używamy pakietu SDK CloudEvents i bibliotek zdarzeń Google do odczytywania danych CloudEvents wysyłanych przez Eventarc. Express to platforma internetowa JavaScript / węzłów. Bluebird używa się do obsługi obietnic.

index.js

Przyjrzyjmy się bliżej naszemu kodowi w usłudze index.js:

const express = require('express');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const { HTTP } = require("cloudevents");
const {toStorageObjectData} = require('@google/events/cloud/storage/v1/StorageObjectData');

Nasz program wymaga różnych zależności: Express to platforma sieciowa węzła, której będziemy używać, Bluebird to biblioteka do obsługi obietnic JavaScriptu, pamięć masowa i Firestore działają odpowiednio z Google Cloud Storage (nasze zasobniki obrazów) oraz z magazynem danych Cloud Firestore. Dodatkowo wymagamy, aby obiekt CloudEvent odczytywał zdarzenie CloudEvent wysłane przez Eventarc StoreObjectData z biblioteki zdarzeń Google w celu odczytania treści zdarzenia Cloud Storage obiektu CloudEvent.

const app = express();
app
.use(express.json());

app
.post('/', async (req, res) => {
   
try {
       
const cloudEvent = HTTP.toEvent({ headers: req.headers, body: req.body });
        console
.log(cloudEvent);


       
/* ... */

   
} catch (err) {
        console
.log(`Error: ${err}`);
        res
.status(500).send(err);
   
}
});

Powyżej przedstawiamy strukturę naszego modułu obsługi węzłów: nasza aplikacja odpowiada na żądania HTTP POST, Odczytuje zdarzenie CloudEvent z żądania HTTP i przeprowadza obsługę błędów na wypadek, gdyby coś poszło nie tak. Przyjrzyjmy się teraz wnętrzu tej konstrukcji.

Następny krok to pobranie i analiza treści CloudEvent oraz pobranie nazwy obiektu:

const storageObjectData = toStorageObjectData(cloudEvent.data);
console
.log(storageObjectData);

const objectName = storageObjectData.name;

Gdy znamy już nazwę obrazu, możemy usunąć go z zasobnika miniatur:

try {
    await storage
.bucket(bucketThumbnails).file(objectName).delete();
    console
.log(`Deleted '${objectName}' from bucket '${bucketThumbnails}'.`);
}
catch(err) {
    console
.log(`Failed to delete '${objectName}' from bucket '${bucketThumbnails}': ${err}.`);
}

Na koniec usuń również metadane obrazu z kolekcji Firestore:

try {
   
const pictureStore = new Firestore().collection('pictures');
   
const docRef = pictureStore.doc(objectName);
    await docRef
.delete();

    console
.log(`Deleted '${objectName}' from Firestore collection 'pictures'`);
}
catch(err) {
    console
.log(`Failed to delete '${objectName}' from Firestore: ${err}.`);
}

res
.status(200).send(`Processed '${objectName}'.`);

Teraz czas na nasłuchiwanie żądań przychodzących przez nasz skrypt węzła. Sprawdź też, czy ustawione są wymagane zmienne środowiskowe:

app.listen(PORT, () => {
   
if (!bucketThumbnails) throw new Error("BUCKET_THUMBNAILS not set");
    console
.log(`Started service on port ${PORT}`);
});

7. Przetestuj lokalnie

Przed wdrożeniem kodu w chmurze przetestuj go lokalnie, aby upewnić się, że działa.

W folderze garbage-collector/nodejs zainstaluj zależności npm i uruchom serwer:

export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT

npm install; npm start

Jeśli wszystko poszło dobrze, serwer powinien uruchamiać się na porcie 8080:

Started service on port 8080

Użyj CTRL-C, aby wyjść.

8. Kompilowanie i wdrażanie w Cloud Run

Przed wdrożeniem w Cloud Run ustaw region Cloud Run na jeden z obsługiwanych regionów i platformy na managed:

REGION=europe-west1
gcloud config set run/region $REGION
gcloud config set run/platform managed

Możesz sprawdzić, czy konfiguracja jest ustawiona:

gcloud config list

...
[run]
platform = managed
region = europe-west1

Zamiast ręcznie kompilować i publikować obraz kontenera za pomocą Cloud Build, możesz też skorzystać z Cloud Run, aby skompilować obraz kontenera za Ciebie za pomocą Google Cloud Buildpacks.

Uruchom to polecenie, aby utworzyć obraz kontenera przy użyciu pakietów Google Cloud Buildpack, a następnie wdrożyć obraz kontenera w Cloud Run:

SERVICE_NAME=garbage-collector-service

gcloud run deploy $SERVICE_NAME \
    --source . \
    --no-allow-unauthenticated \
    --update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS

Zwróć uwagę na flagę –-source. Oznacza to, że Cloud Run będzie używać Google Cloud Buildpacks do utworzenia obrazu kontenera bez Dockerfile.. Flaga --no-allow-unauthenticated sprawia, że usługa Cloud Run jest usługą wewnętrzną, która będzie aktywowana tylko przez określone konta usługi. Później utworzysz aktywator z domyślnym kontem usługi Compute, które ma przypisaną rolę run.invoker do wywoływania wewnętrznych usług Cloud Run.

9. Utwórz regułę

W Eventarc aktywator określa, która usługa powinna pobierać określone rodzaje zdarzeń. W tym przypadku chcesz, aby usługa otrzymywała zdarzenia po usunięciu pliku z zasobnika.

Ustaw lokalizację reguły w tym samym regionie co zasobnik przesłanych obrazów:

gcloud config set eventarc/location eu

Utwórz aktywator AuditLog, aby filtrować zdarzenia storage.objects.delete i wysyłać je do usługi Cloud Run:

BUCKET_IMAGES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT

gcloud eventarc triggers create trigger-$SERVICE_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.deleted" \
  --event-filters="bucket=$BUCKET_IMAGES" \
  --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

Aby dokładnie sprawdzić, czy aktywator został utworzony, użyj tego polecenia:

gcloud eventarc triggers list

10. Testowanie usługi

Aby sprawdzić, czy usługa działa, przejdź do zasobnika uploaded-pictures i usuń jeden z obrazów. W logach usługi powinna być widoczna informacja, że usuwa ona odpowiedni obraz z zasobnika thumbnails, a także jej dokument z kolekcji Firestore pictures.

519abf90e7ea4d12.png

11. Czyszczenie (opcjonalnie)

Jeśli nie chcesz przechodzić do innych modułów z tej serii, możesz zwolnić zasoby, aby zmniejszyć koszty i zachować dobre praktyki związane z chmurą. Zasoby możesz wyczyścić pojedynczo w ten sposób.

Usuń usługę:

gcloud run services delete $SERVICE_NAME -q

Usuń aktywator Eventarc:

gcloud eventarc triggers delete trigger-$SERVICE_NAME -q

Możesz też usunąć cały projekt:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

12. Gratulacje!

Gratulacje! Udało Ci się utworzyć usługę Cloud Run – kolektor czyszczenia pamięci obrazów, który jest aktywowany przez Eventarc – nową usługę do odbierania zdarzeń w Cloud Run. Gdy zdjęcie zostanie usunięte z zasobnika zdjęć, usługa otrzyma zdarzenie z Eventarc. Następnie usuwa obraz z zasobnika miniatur oraz usuwa go z kolekcji obrazów Firestore.

Omówione zagadnienia

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc