Wprowadzenie do funkcji Cloud Run uruchamianych po zdarzeniach

1. Wprowadzenie

Przegląd

Funkcje Cloud Run to nowy sposób wdrażania zbiorów zadań z wykorzystaniem znanych paradygmatów zdarzeń i sygnatury funkcji GCF. Zamiast korzystać z naszego procesu kompilacji i konfiguracji wdrożenia, funkcje Cloud Run zapewniają bezpośrednią kontrolę nad usługą utworzoną w Cloud Run.

W przypadku funkcji Cloud Run udostępniamy prosty interfejs użytkownika wdrażania źródła Cloud Run, który zapewnia programistom pełną kontrolę nad ich obciążeniami za pomocą konfiguracji Cloud Run.

Z tej sekcji dowiesz się, jak wdrożyć funkcję opartą na zdarzeniach w Node. Wdrożysz funkcję, która jest wywoływana za każdym razem, gdy obiekt jest finalizowany w zasobniku Cloud Storage.

W przykładach poniżej używamy próbek nodejs. Możesz jednak użyć przykładowych kodów Cloud Functions 2 generacji w wybranym języku:

Czego się nauczysz

  • Jak wdrożyć funkcję Cloud Run opartą na zdarzeniach, która jest wywoływana za każdym razem, gdy obiekt jest przesyłany do zasobnika GCS
  • Jak utworzyć konto usługi z odpowiednimi rolami, aby otrzymywać zdarzenia z Cloud Storage i wywoływać funkcję Cloud Run

2. Konfigurowanie zmiennych środowiskowych i włączanie interfejsów API

Aktualizowanie gcloud CLI

Ten przewodnik wymaga zainstalowania najnowszej wersji interfejsu gcloud CLI. Aby zaktualizować interfejs CLI, uruchom

gcloud components update

Włącz interfejsy API

Zanim zaczniesz korzystać z tego samouczka, musisz włączyć kilka interfejsów API. Ten przewodnik wymaga użycia tych interfejsów API: Możesz włączyć te interfejsy API, uruchamiając to polecenie:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

Konfigurowanie zmiennych środowiskowych

Możesz ustawić zmienne środowiskowe, których będziesz używać podczas naszych ćwiczeń z programowania.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. Tworzenie zasobnika na dane i konta usługi

Utworzenie zasobnika na dane

Zasobnik Cloud Storage możesz utworzyć, uruchamiając to polecenie:

gsutil mb -l us-central1 gs://$BUCKET_NAME

Tworzenie konta usługi

W tym przykładzie utworzysz konto usługi z wymaganymi uprawnieniami EventArc i rolą wywołującego Cloud Run, aby otrzymywać zdarzenia z Cloud Storage i wywoływać funkcję Cloud Run.

Najpierw utwórz konto usługi.

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

SERVICE_ACCOUNT="cloud-run-functions"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

Następnie przyznaj w projekcie rolę Odbiorca zdarzeń Eventarc (roles/eventarc.eventReceiver) kontu usługi powiązanemu z aktywatorem Eventarc, aby aktywator mógł odbierać zdarzenia od dostawców zdarzeń.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

Następnie przypisz do konta usługi rolę wywołującego Cloud Run, aby mogło wywoływać funkcję.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

4. Tworzenie i wdrażanie funkcji

Najpierw utwórz katalog kodu źródłowego i przejdź do niego.

mkdir ../$SERVICE_NAME && cd $_

Następnie utwórz plik package.json o tej treści:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

Następnie utwórz plik index.js o tej treści:

const functions = require("@google-cloud/functions-framework");

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

Teraz możesz wdrożyć funkcję Cloud Run, uruchamiając to polecenie:

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

Uwaga:

  • Flaga –source służy do informowania Cloud Run, że funkcja ma zostać skompilowana w usługę opartą na kontenerach, którą można uruchomić.
  • Flaga –function (nowa) służy do ustawiania punktu wejścia nowego serwisu na sygnaturę funkcji, którą chcesz wywołać.
  • (opcjonalnie) argument –no-allow-unauthenticated, aby uniemożliwić publiczne wywoływanie funkcji.

Aby wyświetlić nową usługę crf-event-codelab, uruchom to polecenie:

gcloud beta run services describe $SERVICE_NAME

5. Tworzenie zdarzenia

Możemy utworzyć aktywator Eventarc, który będzie wysyłać wiadomości do naszej funkcji za każdym razem, gdy obiekt zostanie sfinalizowany w Google Cloud Storage:

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

Uwaga:

  • gcs-function-trigger to nazwa reguły.
  • crf-event-codelab to nazwa usługi Cloud Run, w której wdrożona jest nasza funkcja.
  • W przypadku flagi –event-filters nie używaj prefiksu gs:// w nazwie zasobnika.

Szczegółowy samouczek dotyczący konfigurowania usługi Trigger z Cloud Storage przy użyciu Eventarc znajdziesz w dokumentacji Cloud Run: https://cloud.google.com/run/docs/tutorials/eventarc

6. Testowanie funkcji

Po zakończeniu wdrażania zobaczysz adres URL usługi. Aby wywołać funkcję, musisz wysłać uwierzytelnione żądanie z tokenem tożsamości lub tokenem tożsamości podmiotu, który ma rolę wywołującego Cloud Run, jak pokazano poniżej:

# get the Service URL
SERVICE_URL="$(gcloud run services describe $SERVICE_NAME --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Po wdrożeniu funkcji i utworzeniu aktywatora możemy wywołać funkcję.

Utwórz plik i prześlij go do zasobnika Cloud Storage. Możesz to zrobić za pomocą interfejsu internetowego konsoli Cloud lub narzędzia wiersza poleceń gsutil, np.

echo "hello world" > test.txt
gsutil cp test.txt gs://$BUCKET_NAME

Po przesłaniu pliku zostanie wygenerowane zdarzenie, a funkcja wydrukuje podstawowe informacje o obiekcie, np. nazwę pliku. Te dane wyjściowe znajdziesz w Cloud Console w logach funkcji. Możesz też wysłać zapytanie o te dane wyjściowe za pomocą gcloud CLI:

gcloud logging read "resource.labels.service_name=$SERVICE_NAME AND textPayload: File" --format=json 

Powinny się wyświetlić te dane wyjściowe:

"textPayload": "File: test.txt"

7. Gratulacje!

Gratulujemy ukończenia ćwiczenia!

Zalecamy zapoznanie się z dokumentacją funkcji Cloud Run.

Omówione zagadnienia

  • Jak wdrożyć funkcję Cloud Run opartą na zdarzeniach, która jest wywoływana za każdym razem, gdy obiekt jest przesyłany do zasobnika GCS
  • Jak utworzyć konto usługi z odpowiednimi rolami, aby otrzymywać zdarzenia z Cloud Storage i wywoływać funkcję Cloud Run

8. Czyszczenie danych

Aby uniknąć przypadkowych opłat (np. jeśli ta usługa Cloud Run zostanie przypadkowo wywołana więcej razy niż miesięczny limit wywołań Cloud Run w ramach bezpłatnej wersji), możesz usunąć usługę Cloud Run lub projekt utworzony w kroku 2.

Aby usunąć usługi Cloud Run, otwórz konsolę Cloud Run w Cloud Console pod adresem https://console.cloud.google.com/run/ i usuń usługę crf-event-codelab utworzoną w tym laboratorium.

Jeśli zdecydujesz się usunąć cały projekt, otwórz stronę https://console.cloud.google.com/cloud-resource-manager, wybierz projekt utworzony w kroku 2 i kliknij Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w Cloud SDK. Listę wszystkich dostępnych projektów możesz wyświetlić, uruchamiając polecenie gcloud projects list.