Informacje o tym ćwiczeniu (w Codelabs)
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.
Czego się nauczysz
- Cloud Run
- Cloud Storage
- Cloud Firestore
- 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. 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.
- 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:
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 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.
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.jspackage.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
.
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