Wprowadzenie do bezserwerowej administracji w Workflows

Wprowadzenie do bezserwerowej administracji za pomocą Workflows

Informacje o tym ćwiczeniu (w Codelabs)

subjectOstatnia aktualizacja: mar 19, 2025
account_circleAutorzy: atamel

1. Wprowadzenie

c9b0cc839df0bb8f.png

Za pomocą Workflows możesz tworzyć bezserwerowe przepływy pracy, które łączą w określonej przez Ciebie kolejności serię bezserwerowych zadań. Możesz wykorzystywać interfejsy API Google Cloud, usługi bezserwerowe, takie jak Cloud Functions i Cloud Run, oraz wywołania zewnętrznych interfejsów API, aby tworzyć elastyczne aplikacje bezserwerowe.

Nie wymaga zarządzania infrastrukturą i płynnie skaluje się na żądanie, również w dół do zera. W przypadku modelu płatności tylko za wykorzystanie zasoby płacisz jedynie za czas wykonywania.

Z tego ćwiczenia z programowania dowiesz się, jak łączyć różne usługi Google Cloud i zewnętrzne interfejsy HTTP API z Workflows. Więcej informacji: połączysz 2 publiczne usługi Cloud Functions, 1 prywatną usługę Cloud Run i zewnętrzny publiczny interfejs HTTP API w ramach przepływu pracy.

Czego się nauczysz

  • Podstawy Workflows.
  • Jak połączyć publiczne funkcje Cloud Functions z przepływami pracy.
  • Jak połączyć prywatne usługi Cloud Run z Workflows
  • Jak połączyć Workflows z zewnętrznymi interfejsami HTTP API.

2. Konfiguracja i wymagania

Konfiguracja środowiska w samodzielnym tempie

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. (jeśli nie masz jeszcze konta Gmail ani G Suite, utwórz je).

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

Zapamiętaj identyfikator projektu, który jest unikalną nazwą w ramach wszystkich projektów Google Cloud (podawana powyżej nazwa jest już zajęta i nie będzie działać). W dalszej części tego ćwiczenia będzie on nazywany PROJECT_ID.

  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Google Cloud.

Przejście przez ten Codelab nie powinno wiązać się z wielkimi kosztami, jeśli w ogóle będą jakieś. Pamiętaj, aby postępować zgodnie z instrukcjami w sekcji „Wyczyszczanie”, które podają, jak wyłączyć zasoby, aby uniknąć opłat po zakończeniu samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchomienie Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w tym przypadku będziesz korzystać z Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

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

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

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

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie poprawia wydajność sieci i uwierzytelnianie. Wszystkie zadania w tym module możesz wykonać w przeglądarce.

3. Omówienie Workflows

Podstawowe informacje

Przepływ pracy składa się z sekwencji kroków opisanych za pomocą składni Workflows opartej na języku YAML. To definicja przepływu pracy. Szczegółowe informacje o składni YAML Workflows znajdziesz na stronie Dokumentacja składni.

Po utworzeniu przepływ pracy jest wdrażany, co powoduje, że jest gotowy do wykonania. Wykonanie to jednorazowe uruchomienie logiki zawartej w definicji przepływu pracy. Wszystkie wykonania przepływu pracy są niezależne, a usługa obsługuje dużą liczbę jednoczesnych wykonań.

Włączanie usług

W tym ćwiczeniu połączysz funkcje Cloud Functions i usługi Cloud Run z workflow. Podczas kompilowania usług będziesz też używać Cloud Build i Cloud Storage.

Włącz wszystkie niezbędne usługi:

gcloud services enable \
  cloudfunctions.googleapis.com \
  run.googleapis.com \
  workflows.googleapis.com \
  cloudbuild.googleapis.com \
  storage.googleapis.com

W następnym kroku połączysz 2 funkcje Cloud Functions w ramach przepływu pracy.

4. Wdrażanie pierwszej funkcji w Cloud Functions

Pierwsza funkcja to generator liczb losowych w Pythonie.

Utwórz katalog dla kodu funkcji i przejdź do niego:

mkdir ~/randomgen
cd ~/randomgen

Utwórz w katalogu plik main.py z podaną niżej treścią:

import random, json
from flask import jsonify

def randomgen(request):
    randomNum = random.randint(1,100)
    output = {"random":randomNum}
    return jsonify(output)

Po otrzymaniu żądania HTTP funkcja ta generuje losową liczbę od 1 do 100 i zwraca ją w formacie JSON do wywołującego.

Funkcja korzysta z Flask do przetwarzania HTTP i musimy dodać ją jako zależność. Zależność w Pythonie jest zarządzana za pomocą pip i wyrażana w pliku metadanych o nazwie requirements.txt.

W tym samym katalogu utwórz plik requirements.txt z tą treścią:

flask>=1.0.2

Wdrożyć funkcję z aktywatorem HTTP i zezwalaniem na żądania bez uwierzytelnienia za pomocą tego polecenia:

gcloud functions deploy randomgen \
    --runtime python312 \
    --trigger-http \
    --allow-unauthenticated

Po wdrożeniu funkcji możesz zobaczyć jej adres URL w właściwości url wyświetlanej w konsoli lub za pomocą polecenia gcloud functions describe.

Adres URL funkcji możesz też otworzyć za pomocą tego polecenia curl:

curl $(gcloud functions describe randomgen --format='value(url)')

Funkcja jest gotowa do użycia w ramach przepływu pracy.

5. Wdrażanie drugiej funkcji w Cloud Functions

Druga funkcja to mnożnik. Funkcja ta mnoży otrzymaną wartość wejściową przez 2.

Utwórz katalog dla kodu funkcji i przejdź do niego:

mkdir ~/multiply
cd ~/multiply

Utwórz w katalogu plik main.py z podaną niżej treścią:

import random, json
from flask import jsonify

def multiply(request):
    request_json = request.get_json()
    output = {"multiplied":2*request_json['input']}
    return jsonify(output)

Gdy otrzyma żądanie HTTP, wyodrębnia z treści JSON wartości input, mnoży je przez 2 i zwraca w formacie JSON do wywołującego.

Utwórz w tym samym katalogu plik requirements.txt o tej samej treści:

flask>=1.0.2

Wdrożyć funkcję z aktywatorem HTTP i zezwalaniem na żądania bez uwierzytelnienia za pomocą tego polecenia:

gcloud functions deploy multiply \
    --runtime python312 \
    --trigger-http \
    --allow-unauthenticated

Po wdrożeniu funkcji możesz też otworzyć jej adres URL za pomocą tego polecenia curl:

curl $(gcloud functions describe multiply --format='value(url)') \
-X POST \
-H "content-type: application/json" \
-d '{"input": 5}'

Funkcja jest gotowa do użycia w ramach przepływu pracy.

6. Łączenie 2 funkcji w Cloud Functions

W pierwszym procesie połącz obie funkcje.

Utwórz plik workflow.yaml z podaną niżej treścią.

- randomgenFunction:
    call: http.get
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/randomgen
    result: randomgenResult
- multiplyFunction:
    call: http.post
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/multiply
        body:
            input: ${randomgenResult.body.random}
    result: multiplyResult
- returnResult:
    return: ${multiplyResult}

W tym przepływie pracy z pierwszej funkcji otrzymujesz losową liczbę, którą przekazujesz do drugiej funkcji. Wynikiem jest pomnożona liczba losowa.

Wdróż pierwszy przepływ pracy:

gcloud workflows deploy workflow --source=workflow.yaml

Wykonaj pierwszy przepływ pracy:

gcloud workflows execute workflow

Po wykonaniu przepływu pracy możesz wyświetlić wynik, podając identyfikator wykonania podany w poprzednim kroku:

gcloud workflows executions describe <your-execution-id> --workflow workflow

Dane wyjściowe będą zawierać resultstate:

result: '{"body":{"multiplied":108},"code":200 ... } 

...
state: SUCCEEDED

7. Łączenie z zewnętrznym interfejsem HTTP API

Następnie połączysz math.js jako usługę zewnętrzną w przepływie pracy.

W bibliotece math.js możesz obliczać wyrażenia matematyczne, np.:

curl https://api.mathjs.org/v4/?'expr=log(56)'

Tym razem użyjesz Cloud Console do zaktualizowania naszego przepływu pracy. Znajdź Workflows w konsoli Google Cloud:

7608a7991b33bbb0.png

Znajdź przepływ pracy i kliknij kartę Definition:

f3c8c4d3ffa49b1b.png

Edytuj definicję przepływu pracy i uwzględnij wywołanie funkcji math.js.

- randomgenFunction:
    call: http.get
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/randomgen
    result: randomgenResult
- multiplyFunction:
    call: http.post
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/multiply
        body:
            input: ${randomgenResult.body.random}
    result: multiplyResult
- logFunction:
    call: http.get
    args:
        url: https://api.mathjs.org/v4/
        query:
            expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"}
    result: logResult
- returnResult:
    return: ${logResult}

Teraz przepływ pracy przekazuje wynik funkcji mnożenia do wywołania funkcji log w funkcji math.js.

Interfejs poprowadzi Cię przez proces edycji i wdrażania przepływu pracy. Po wdrożeniu kliknij Execute, aby wykonać przepływ pracy. Zobaczysz szczegóły wykonania:

b40c76ee43a1ce65.png

Zwróć uwagę na kod stanu 200body z wynikiem funkcji log.

Właśnie zintegrowałeś zewnętrzną usługę z naszym przepływem pracy. Super!

8. Wdrażanie usługi Cloud Run

W ostatniej części sfinalizuj przepływ pracy, wywołując prywatną usługę Cloud Run. Oznacza to, że aby wywołać usługę Cloud Run, należy uwierzytelnić przepływ pracy.

Usługa Cloud Run zwraca math.floor przekazanej liczby.

Utwórz katalog z kodem usługi i przejdź do niego:

mkdir ~/floor
cd ~/floor

Utwórz w katalogu plik app.py z podaną niżej treścią:

import json
import logging
import os
import math

from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=['POST'])
def handle_post():
    content = json.loads(request.data)
    input = float(content['input'])
    return f"{math.floor(input)}", 200

if __name__ != '__main__':
    # Redirect Flask logs to Gunicorn logs
    gunicorn_logger = logging.getLogger('gunicorn.error')
    app.logger.handlers = gunicorn_logger.handlers
    app.logger.setLevel(gunicorn_logger.level)
    app.logger.info('Service started...')
else:
    app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

Cloud Run wdraża kontenery, więc musisz utworzyć Dockerfile, a Twój kontener musi być powiązany z zmienną środowiskową 0.0.0.0 i PORT, stąd powyższy kod.

Gdy otrzyma żądanie HTTP, wyodrębni z treści JSON input, wywoła funkcję math.floor i zwróci wynik wywołującemu.

W tym samym katalogu utwórz plik Dockerfile:

# Use an official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.7-slim

# Install production dependencies.
RUN pip install Flask gunicorn

# Copy local code to the container image.
WORKDIR /app
COPY . .

# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
CMD exec gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app

Kompilacja kontenera:

export SERVICE_NAME=floor
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}

Po skompilowaniu kontenera wdrożyć go w Cloud Run. Zwróć uwagę na flagę no-allow-unauthenticated. Dzięki temu usługa akceptuje tylko wywołania uwierzytelnione:

gcloud run deploy ${SERVICE_NAME} \
  --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
  --platform managed \
  --no-allow-unauthenticated

Po wdrożeniu usługa jest gotowa do pracy.

9. Łączenie usługi Cloud Run

Zanim skonfigurujesz Workflows tak, aby wywoływał prywatną usługę Cloud Run, musisz utworzyć konto usługi, którego Workflows będzie używać:

export SERVICE_ACCOUNT=workflows-sa
gcloud iam service-accounts create ${SERVICE_ACCOUNT}

Przypisz do konta usługi rolę run.invoker. Pozwoli to kontu usługi wywoływać uwierzytelnione usługi Cloud Run:

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member "serviceAccount:${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role "roles/run.invoker"

Zaktualizuj definicję przepływu pracy w workflow.yaml, aby uwzględnić usługę Cloud Run. Zwróć uwagę, że pole auth jest również uwzględnione, aby Workflows przekazywał token uwierzytelniania w wywołaniach usługi Cloud Run:

- randomgenFunction:
    call: http.get
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/randomgen
    result: randomgenResult
- multiplyFunction:
    call: http.post
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/multiply
        body:
            input: ${randomgenResult.body.random}
    result: multiplyResult
- logFunction:
    call: http.get
    args:
        url: https://api.mathjs.org/v4/
        query:
            expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"}
    result: logResult
- floorFunction:
    call: http.post
    args:
        url: https://floor-<random-hash>.run.app
        auth:
            type: OIDC
        body:
            input: ${logResult.body}
    result: floorResult
- returnResult:
    return: ${floorResult}

Zaktualizuj przepływ pracy. Czas na koncie usługi:

gcloud workflows deploy workflow \
    --source=workflow.yaml \
    --service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

Wykonywanie przepływu pracy:

gcloud workflows execute workflow

Po kilku sekundach możesz sprawdzić wykonanie przepływu pracy, aby zobaczyć wynik:

gcloud workflows executions describe <your-execution-id> --workflow workflow

Dane wyjściowe będą zawierać liczbę całkowitą resultstate:

result: '{"body":"5","code":200 ... } 

...
state: SUCCEEDED

10. Gratulacje!

Gratulujemy ukończenia ćwiczenia.

Omówione zagadnienia

  • Podstawy Workflows
  • Jak połączyć publiczne funkcje Cloud Functions z przepływami pracy.
  • Jak połączyć prywatne usługi Cloud Run z Workflows
  • Jak połączyć Workflows z zewnętrznymi interfejsami HTTP API.