1. Przegląd
Seria codelabów Serverless Migration Station (samodzielne, praktyczne samouczki) i powiązane z nimi filmy mają na celu pomóc deweloperom usług bezserwerowych Google Cloud w modernizacji aplikacji poprzez przeprowadzenie ich przez co najmniej jedną migrację, głównie z usług starszego typu. Dzięki temu Twoje aplikacje będą bardziej przenośne, a Ty zyskasz więcej opcji i elastyczności, co umożliwi Ci integrację z szerszą gamą usług w chmurze i łatwiejsze przechodzenie na nowsze wersje języka. Chociaż początkowo skupialiśmy się na pierwszych użytkownikach usług w chmurze, głównie na deweloperach App Engine (środowisko standardowe), ta seria jest wystarczająco szeroka, aby obejmować inne platformy bezserwerowe, takie jak Cloud Functions i Cloud Run, lub inne, jeśli ma to zastosowanie.
Czasami nie masz „całej aplikacji”, która wymagałaby zasobów App Engine lub Cloud Run. Jeśli Twój kod składa się tylko z mikrousługi lub prostej funkcji, lepszym rozwiązaniem będzie prawdopodobnie Cloud Functions. W tym samouczku dowiesz się, jak przenieść proste aplikacje App Engine (lub podzielić większe aplikacje na wiele mikroserwisów) i wdrożyć je w Cloud Functions, czyli na innej platformie bezserwerowej stworzonej specjalnie do takich przypadków użycia.
Dowiesz się, jak:
- Korzystanie z Cloud Shell
- Włączanie interfejsu Google Cloud Translation API
- Uwierzytelnianie żądań do interfejsu API
- Konwertowanie małej aplikacji App Engine, aby można było ją uruchamiać w Cloud Functions
- Wdrażanie kodu w Cloud Functions
Czego potrzebujesz
- projekt Google Cloud Platform z aktywnym kontem rozliczeniowym GCP;
- podstawowe umiejętności w zakresie Pythona,
- Praktyczna znajomość typowych poleceń systemu Linux
- Podstawowa wiedza na temat tworzenia i wdrażania aplikacji App Engine.
- Działająca aplikacja w języku Python 3 App Engine z modułu 2 Cloud NDB
- Zalecane: wykonaj ćwiczenie z programowania w module 2 oraz dodatkowy krok polegający na przeniesieniu aplikacji z języka Python 2 do Python 3.
Ankieta
Jak zamierzasz korzystać z tego samouczka?
Jak oceniasz swoje doświadczenie z Pythonem?
Jak oceniasz korzystanie z usług Google Cloud?
2. Tło
Systemy PaaS, takie jak Google App Engine i Cloud Functions, zapewniają użytkownikom wiele udogodnień. Te platformy bezserwerowe umożliwiają zespołowi technicznemu skupienie się na tworzeniu rozwiązań biznesowych zamiast na badaniu platform, z których można korzystać, i określaniu ilości potrzebnego sprzętu. Aplikacje mogą automatycznie skalować się w górę w miarę potrzeb, skalować w dół do zera z płatnościami za użycie, aby kontrolować koszty, i obsługują różne popularne obecnie języki programowania.
Chociaż App Engine doskonale nadaje się do tworzenia pełnych aplikacji internetowych lub złożonych backendów aplikacji mobilnych, często zdarza się, że deweloperzy chcą po prostu udostępnić w internecie jakąś funkcję, np. aktualizować kanał wiadomości lub pobierać najnowsze wyniki meczu play-off drużyny gospodarzy. Logika kodowania istnieje w obu scenariuszach, ale żaden z nich nie jest pełną „aplikacją” wymagającą mocy App Engine. W tym miejscu przydają się Cloud Functions.
Cloud Functions służy do wdrażania małych fragmentów kodu, które:
- Nie jest częścią całej aplikacji
- Nie jest potrzebny w całym stosie technologicznym
- jest w aplikacji lub pojedynczym backendzie aplikacji mobilnej, który koncentruje się na jednej rzeczy;
Możesz też użyć Cloud Functions, aby podzielić dużą, monolityczną aplikację na wiele mikroserwisów, z których każdy korzysta ze wspólnej bazy danych, takiej jak Cloud Firestore lub Cloud SQL. Jeśli chcesz, aby Twoja funkcja lub mikrousługa była skonteneryzowana i wykonywana bezserwerowo w Cloud Run, możesz to zrobić.
Nasza przykładowa aplikacja App Engine, która pojawiła się w niemal wszystkich samouczkach dotyczących migracji, to krótka aplikacja z podstawowymi funkcjami, która działa równie dobrze w Cloud Functions. Z tego samouczka dowiesz się, jak zmodyfikować tę aplikację, aby działała w Cloud Functions. Z perspektywy App Engine funkcje są prostsze niż całe aplikacje, więc rozpoczęcie pracy powinno być łatwiejsze (i szybsze) oraz ogólnie mniej „obciążające”. Migracja obejmuje te kroki:
- Konfiguracja/przygotowanie
- Usuwanie plików konfiguracji
- Modyfikowanie plików aplikacji
3. Konfiguracja/przygotowanie
Ten samouczek zaczyna się od wersji przykładowej aplikacji Module 2 Cloud NDB App Engine w języku Python 3, ponieważ Cloud Functions nie obsługuje języka Python 2. Najpierw skonfigurujemy projekt, pobierzemy kod, a potem wdrożymy aplikację podstawową, aby potwierdzić, że zaczynamy od działającego kodu.
1. Konfigurowanie projektu
Jeśli masz za sobą moduł 2 (i przeniesiesz go do języka Python 3), zalecamy ponowne użycie tego samego projektu (i kodu). Możesz też utworzyć zupełnie nowy projekt lub ponownie wykorzystać inny istniejący projekt. Sprawdź, czy projekt ma aktywne konto rozliczeniowe z włączoną usługą App Engine.
2. Pobieranie przykładowej aplikacji podstawowej
Jednym z wymagań wstępnych do tych ćwiczeń z programowania jest działająca przykładowa aplikacja z modułu 2. Jeśli jej nie masz, przed przejściem dalej wykonaj jeden z samouczków, do których linki znajdziesz powyżej. Jeśli znasz już jego zawartość, możesz zacząć od pobrania kodu modułu 2 poniżej.
Niezależnie od tego, czy używasz własnego kodu, czy naszego, ZACZNIEMY od kodu modułu 2 w języku Python 3. W tym module 11 Codelabs znajdziesz instrukcje krok po kroku, a na końcu kod podobny do tego, który znajduje się w folderze repozytorium modułu 11 (FINISH).
- START: Kod modułu 2 (3.x [folder repozytorium modułu 2b])
- FINISH: Module 11 code (3.x)
- Całe repozytorium (do sklonowania lub pobrania pliku ZIP)
Katalog plików STARTOWYCH modułu 2 języka Python 3 (Twój lub nasz) powinien wyglądać tak:
$ ls README.md main.py templates app.yaml requirements.txt
3. (Ponowne) wdrażanie aplikacji bazowej
Pozostałe czynności przygotowawcze, które musisz teraz wykonać:
- Przypomnij sobie, jak działa narzędzie wiersza poleceń
gcloud. - Ponowne wdrażanie przykładowej aplikacji za pomocą
gcloud app deploy - Sprawdź, czy aplikacja działa w App Engine bez problemów.
Po wykonaniu tych czynności możesz przekształcić go w funkcję Cloud Function.
4. Usuwanie plików konfiguracji
Plik app.yaml jest artefaktem App Engine, który nie jest używany w Cloud Functions, więc usuń go teraz. Jeśli tego nie zrobisz lub o tym zapomnisz, nic się nie stanie, ponieważ Cloud Functions nie używa tej wartości. To jedyna zmiana konfiguracji, ponieważ requirements.txt pozostaje identyczne jak w module 2.
Jeśli portujesz też aplikację App Engine w Pythonie 2 do Pythona 3, usuń appengine_config.py i folder lib, jeśli go masz. Są to artefakty App Engine nieużywane w środowisku wykonawczym Python 3.
5. Modyfikowanie plików aplikacji
Jest tylko jeden plik aplikacji, main.py, więc wszystkie niezbędne zmiany, które trzeba wprowadzić, aby przejść na Cloud Functions, są w nim zawarte.
Importy
Ponieważ pracujemy tylko z funkcjami, nie potrzebujemy platformy aplikacji internetowej. Jednak dla wygody, gdy wywoływane są funkcje Cloud Functions oparte na Pythonie, automatycznie przekazywany jest do nich obiekt żądania, którego kod może używać w razie potrzeby. (Zespół Cloud Functions wybrał go jako obiekt żądania Flask przekazywany do funkcji).
Platformy internetowe nie są częścią środowiska Cloud Functions, więc nie ma importów z Flaska, chyba że aplikacja korzysta z innych funkcji Flaska. Tak jest w naszym przypadku, ponieważ renderowanie szablonu nadal odbywa się po przekształceniu go w funkcję, co oznacza, że nadal wymagane jest wywołanie flask.render_template(), a tym samym jego importowanie z Flask. Brak platformy internetowej oznacza, że nie musisz tworzyć instancji aplikacji Flask, więc usuń app = Flask(__name__). Przed wprowadzeniem zmian i po ich wprowadzeniu kod powinien wyglądać tak:
PRZED:
from flask import Flask, render_template, request
from google.cloud import ndb
app = Flask(__name__)
ds_client = ndb.Client()
PO:
from flask import render_template
from google.cloud import ndb
ds_client = ndb.Client()
Jeśli korzystasz z obiektu aplikacji (app) lub innej infrastruktury platformy internetowej, musisz rozwiązać wszystkie te zależności, znaleźć odpowiednie obejścia lub całkowicie usunąć ich użycie albo znaleźć serwery proxy. Dopiero wtedy możesz przekształcić kod w funkcję Cloud Function. W przeciwnym razie lepiej pozostać w App Engine lub skonteneryzować aplikację na potrzeby Cloud Run.
Aktualizowanie podpisu głównej funkcji obsługi
Wymagane zmiany w sygnaturze funkcji są następujące:
- Po przekształceniu aplikacji w funkcję Cloud Function Flask nie jest już używany, więc usuń dekoratory tras.
- Cloud Functions automatycznie przekazuje obiekt Flask
Requestjako parametr, więc utwórz dla niego zmienną. W naszej przykładowej aplikacji nazwiemy jąrequest. - Wdrożone funkcje w Cloud Functions muszą mieć nazwy. Nasz główny moduł obsługi w App Engine miał odpowiednią nazwę
root(), która opisywała jego funkcję (główny moduł obsługi aplikacji). W przypadku Cloud Functions używanie tej nazwy ma mniejszy sens. Zamiast tego wdrożymy funkcję Cloud Function o nazwievisitme, więc użyj jej również jako nazwy funkcji Pythona. Podobnie w modułach 4 i 5 nazwaliśmy usługę Cloud Runvisitme.
Oto przykłady przed i po wprowadzeniu tych zmian:
PRZED:
@app.route('/')
def root():
'main application (GET) handler'
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10)
return render_template('index.html', visits=visits)
PO:
def visitme(request):
'main application (GET) handler'
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10)
return render_template('index.html', visits=visits)
To wszystkie niezbędne aktualizacje. Pamiętaj, że wprowadzone zmiany dotyczyły tylko kodu „infrastruktury” aplikacji. Nie trzeba wprowadzać żadnych zmian w głównym kodzie aplikacji ani modyfikować jej funkcji. Aby to zilustrować, przedstawiamy graficznie wprowadzone zmiany:

Lokalne programowanie i testowanie
App Engine ma dev_appserver.py lokalny serwer programistyczny, a Cloud Functions ma Functions Framework. Za pomocą tej platformy możesz tworzyć i testować aplikacje lokalnie. Kod można wdrożyć w Cloud Functions, ale także na innych platformach obliczeniowych, takich jak Compute Engine, Cloud Run, a nawet w systemach lokalnych lub chmury hybrydowej obsługujących Knative. Poniżej znajdziesz dodatkowe linki do platformy funkcji.
6. Tworzenie i wdrażanie
Wdrażanie w Cloud Functions różni się nieco od wdrażania w App Engine. Ponieważ poza requirements.txt nie są używane żadne pliki konfiguracyjne, więcej informacji o kodzie należy podać w wierszu poleceń. Wdróż nową funkcję w Cloud Functions aktywowaną przez HTTP, która działa w Pythonie 3.10, za pomocą tego polecenia:
$ gcloud functions deploy visitme --runtime python310 --trigger-http --allow-unauthenticated
Dane wyjściowe powinny być podobne do tych:
Deploying function (may take a while - up to 2 minutes)...⠛ For Cloud Build Logs, visit: https://console.cloud.google.com/cloud-build/builds;region=REGION/f5f6fc81-1bb3-4cdb-8bfe?project=PROJECT_ID Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 buildId: f5f6fc81-1bb3-4cdb-8bfe buildName: projects/PROJECT_ID/locations/REGION/builds/f5f6fc81-1bb3-4cdb-8bfe dockerRegistry: CONTAINER_REGISTRY entryPoint: visitme httpsTrigger: securityLevel: SECURE_OPTIONAL url: https://REGION-PROJECT_ID.cloudfunctions.net/visitme ingressSettings: ALLOW_ALL labels: deployment-tool: cli-gcloud name: projects/PROJECT_ID/locations/REGION/functions/visitme runtime: python310 serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com sourceUploadUrl: https://storage.googleapis.com/uploads-853031211983.REGION.cloudfunctions.appspot.com/8c923758-cee8-47ce-8e97-5720a5301c34.zip status: ACTIVE timeout: 60s updateTime: '2022-05-16T18:28:06.153Z' versionId: '8'
Po wdrożeniu funkcji użyj adresu URL z danych wyjściowych wdrożenia i otwórz aplikację. Adres URL ma postać REGION-PROJECT_ID.cloudfunctions.net/visitme. Dane wyjściowe powinny być identyczne z tymi, które pojawiły się podczas wcześniejszego wdrażania w App Engine:

Podobnie jak w przypadku większości innych ćwiczeń z programowania i filmów z tej serii podstawowa funkcjonalność aplikacji nie ulega zmianie. Chodzi o zastosowanie jednej techniki modernizacji i zapewnienie, że aplikacja będzie działać dokładnie tak jak wcześniej, ale na nowszej infrastrukturze. Może to być np. migracja ze starszej usługi App Engine do jej zamiennika, czyli samodzielnej usługi Cloud, lub, jak w przypadku tego samouczka, przeniesienie aplikacji na inną bezserwerową platformę Google Cloud.
7. Podsumowanie i czyszczenie
Gratulujemy przekształcenia tej małej aplikacji App Engine w funkcję w Cloud Functions. Inny odpowiedni przypadek użycia: podzielenie dużej monolitycznej aplikacji App Engine na serię mikroserwisów, z których każdy jest funkcją Cloud Function. Jest to nowocześniejsza technika tworzenia, która pozwala uzyskać komponent w stylu „plug-and-play” (np. „ JAM stack”). Umożliwia to łączenie i dopasowywanie oraz ponowne wykorzystywanie kodu, co jest korzystne, ale kolejną zaletą jest to, że te mikroserwisy będą z czasem debugowane, co oznacza stabilny kod i niższe koszty utrzymania.
Czyszczenie danych
Po ukończeniu tego laboratorium możesz wyłączyć aplikację App Engine z modułu 2 (tymczasowo lub na stałe), aby uniknąć naliczania opłat. Platforma App Engine ma bezpłatny limit, więc dopóki nie przekroczysz poziomu wykorzystania, nie będziesz obciążany(-a) opłatami. To samo dotyczy usługi Datastore. Więcej informacji znajdziesz na stronie z cennikiem Cloud Datastore.
Wdrażanie na platformach takich jak App Engine i Cloud Functions wiąże się z niewielkimi kosztami kompilacji i przechowywania. W niektórych regionach Cloud Build ma własny bezpłatny limit, podobnie jak Cloud Storage. Kompilacje wykorzystują część tego limitu. Monitoruj wykorzystanie miejsca na dane, aby zminimalizować potencjalne koszty, zwłaszcza jeśli w Twoim regionie nie ma takiego bezpłatnego poziomu.
Niestety Cloud Functions nie ma funkcji „wyłączania”. Zrób kopię zapasową kodu i usuń funkcję. Zawsze możesz później ponownie wdrożyć go pod tą samą nazwą. Jeśli jednak nie zamierzasz kontynuować żadnych innych ćwiczeń z programowania dotyczących migracji i chcesz wszystko całkowicie usunąć, wyłącz projekty w Google Cloud.
Dalsze kroki
Oprócz tego samouczka warto zapoznać się z innymi modułami migracji, np. dotyczącymi kontenerowania aplikacji App Engine na potrzeby Cloud Run. Zobacz linki do ćwiczeń z programowania w modułach 4 i 5:
- Moduł 4. Migracja do Cloud Run za pomocą Dockera
- Konteneryzowanie aplikacji do uruchamiania w Cloud Run za pomocą Dockera
- Ta migracja umożliwia dalsze korzystanie z języka Python 2.
- Moduł 5. Migracja do Cloud Run za pomocą Cloud Buildpacks
- Konteneryzowanie aplikacji do uruchamiania w Cloud Run za pomocą pakietów kompilacji Cloud Build
- Nie musisz nic wiedzieć o Dockerze, kontenerach ani
Dockerfile. - Wymaga migracji aplikacji do języka Python 3 (pakiety kompilacji nie obsługują języka Python 2).
Wiele innych modułów skupia się na pokazaniu deweloperom, jak przejść z pakietu usług App Engine na samodzielne usługi Cloud:
- Moduł 2. Migracja z App Engine
ndbdo Cloud NDB - Moduły 7–9: migracja z zadań push w kolejce zadań App Engine do Cloud Tasks
- Moduły 12–13: migracja z Memcache App Engine do Cloud Memorystore
- Moduły 15–16: migracja z App Engine Blobstore do Cloud Storage
- Moduły 18–19: migracja z kolejki zadań App Engine (zadania pull) do Cloud Pub/Sub
Jeśli konteneryzacja stała się częścią procesu tworzenia aplikacji, zwłaszcza jeśli obejmuje potok CI/CD (tryb ciągłej integracji/tryb ciągłego dostarczania lub wdrażanie), rozważ migrację do Cloud Run zamiast Cloud Functions. Aby umieścić aplikację w kontenerze za pomocą Dockera, zapoznaj się z modułem 4. Jeśli chcesz to zrobić bez kontenerów, wiedzy o Dockerze lub Dockerfile, przeczytaj moduł 5. Przejście na inną platformę bezserwerową, np. Cloud Functions lub Cloud Run, jest opcjonalne. Zanim wprowadzisz jakiekolwiek zmiany, zalecamy rozważenie najlepszych opcji dla Twoich aplikacji i przypadków użycia.
Niezależnie od tego, który moduł migracji wybierzesz, wszystkie materiały dotyczące Serverless Migration Station (ćwiczenia z programowania, filmy, kod źródłowy [jeśli jest dostępny]) znajdziesz w repozytorium open source. W repozytorium README znajdziesz też wskazówki dotyczące migracji, które warto rozważyć, oraz odpowiednią „kolejność” modułów migracji.
8. Dodatkowe materiały
Problemy i opinie dotyczące ćwiczeń z programowania modułu migracji App Engine
Jeśli zauważysz jakieś problemy z tym kursem, najpierw poszukaj rozwiązania, a dopiero potem zgłoś problem. Linki do wyszukiwania i tworzenia nowych problemów:
Materiały dotyczące migracji
Linki do folderów repozytorium dla modułu 8 (START) i modułu 9 (FINISH) znajdziesz w tabeli poniżej. Możesz też uzyskać do nich dostęp w repozytorium wszystkich migracji codelabów App Engine, które możesz sklonować lub pobrać jako plik ZIP.
Ćwiczenia z programowania | Python 3 |
Zasoby online
Poniżej znajdziesz zasoby online, które mogą być przydatne w tym samouczku:
App Engine
- Dokumentacja App Engine
- Środowisko wykonawcze App Engine (środowisko standardowe) w Pythonie 2
- Środowisko wykonawcze Pythona 3 w App Engine (środowisko standardowe)
- Różnice między środowiskami wykonawczymi App Engine (środowisko standardowe) w Pythonie 2 i 3
- Przewodnik po migracji z App Engine (środowisko standardowe) z Pythona 2 na Pythona 3
- Informacje o cenach i limitach App Engine
- Uruchomienie platformy App Engine drugiej generacji (2018)
- Porównanie platform pierwszej i drugiej generacji
- Wsparcie długoterminowe dla starszych środowisk wykonawczych
- Repozytorium z przykładami migracji dokumentacji
- Repozytorium próbek migracji udostępnionych przez społeczność
Cloud Functions
- Polecenie gcloud functions deploy
- Informacje o cenach
- Ogłoszenie dotyczące Cloud Functions nowej generacji
- Różnice między funkcjami pierwszej i drugiej generacji
- Functions Framework (lokalne programowanie) – instrukcje, dokumentacja i repozytorium
- Strony produktów
- Dokumentacja
Inne informacje o chmurze
- Python w Google Cloud Platform
- Biblioteki klienta Google Cloud Python
- Poziom „Zawsze bezpłatny” w Google Cloud
- Google Cloud SDK (narzędzie wiersza poleceń
gcloud) - Cała dokumentacja Google Cloud
Filmy
- Serverless Migration Station
- Ekspedycje bezserwerowe
- Subskrybuj Google Cloud Tech
- Subskrybuj Google Developers
Licencja
To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.