1. Omówienie
Google Cloud Functions to bezserwerowa platforma obliczeniowa oparta na zdarzeniach. Cloud Functions umożliwia tworzenie kodu bez konieczności martwienia się o przygotowywanie zasobów czy skalowanie w celu sprostania wymaganiom.
Funkcje w Cloud Functions można tworzyć w języku JavaScript i wykonywać w środowisku Node.js na platformie Google Cloud Platform. Funkcję w Cloud Functions możesz uruchomić w dowolnym standardowym środowisku wykonawczym Node.js, aby umożliwić przenośność i testowanie lokalne.
Przejście
W tym laboratorium kodu utworzysz funkcję w Cloud Functions dla Node.js, która będzie informować, czy podana temperatura jest akceptowalna, czy za wysoka. Użyjesz Visual Studio Code na komputerze lokalnym do tworzenia, testowania i debugowania funkcji Cloud. Na koniec wdrożysz funkcję w Google Cloud Platform.
Czego się nauczysz
- Framework funkcji dla Node.js.
- utworzyć i przetestować lokalnie funkcję HTTP w Cloud Functions.
- Debugowanie funkcji HTTP na komputerze lokalnym.
- Wdróż funkcję HTTP z komputera lokalnego.
2. Konfiguracja i wymagania
Wymagania wstępne
- Cloud SDK
- Visual Studio Code
- Node.js w wersji 8.6.0 lub nowszej (aby zainstalować Node.js, użyj nvm, a aby sprawdzić wersję, uruchom polecenie node –version)
- Ukończenie treści z poradnika Moja pierwsza funkcja w Node.js
Koszty
Chociaż w tym laboratorium kodu potrzebne jest tylko 1 wywołanie zaimplementowanej funkcji w Cloud Functions, aby zrozumieć, jak działa rozliczenie, warto zapoznać się z informacjami o cenie interfejsu Cloud Functions API.
Chociaż wiele interfejsów API Google można używać bez opłat, korzystanie z Google Cloud Platform (czyli z jej usług i interfejsów API) nie jest bezpłatne. Aby korzystać z Cloud Functions, musisz mieć aktywne konto rozliczeniowe. Pamiętaj, że niektóre usługi Google Cloud Platform (GCP) mają poziom „Zawsze bezpłatnie”, który musisz przekroczyć, aby generować opłaty. W ramach tego ćwiczenia każda wywołana funkcja w Cloud Functions jest wliczana do tego poziomu bezpłatnego. Dopóki nie przekroczysz limitu w całości (w danym miesiącu), nie powinieneś ponieść żadnych opłat.
3. Instalowanie platformy Functions dla Node.js
Platforma funkcji dla Node.js to platforma FaaS (funkcje jako usługa) typu open source do tworzenia przenośnych funkcji Node.js, którą udostępnia zespół Google Cloud Functions.
Framework funkcji umożliwia tworzenie lekkich funkcji, które działają w wielu różnych środowiskach, m.in.:
- Google Cloud Functions
- Twój lokalny komputer do programowania
- Cloud Run i Cloud Run w GKE
- Środowiska oparte na Knative
Utwórz nową aplikację Node.js.
npm init
Podczas akceptowania ustawień domyślnych użyj index.js
jako punktu wejścia do aplikacji.
Teraz zainstaluj platformę Functions Framework dla Node.js.
npm install @google-cloud/functions-framework
Otwórz plik package.json. Sprawdź, czy framework funkcji jest wymieniony jako zależność, jak w przykładzie poniżej.
"dependencies": { "@google-cloud/functions-framework": "^1.7.1" }
Framework funkcji został zainstalowany. Możesz teraz utworzyć funkcję w Cloud Functions.
4. Tworzenie i testowanie funkcji HTTP w Cloud Functions na komputerze lokalnym
Tworzenie lokalnej funkcji w Cloud Functions
W tej sekcji utworzysz i przetestujesz funkcję HTTP, która odpowiada na żądania HTTP.
W tym samym katalogu co plik package.json utwórz nowy plik o nazwie index.js
.
Dodaj te informacje:
exports.validateTemperature = async (req, res) => { try { if (req.body.temp < 100) { res.status(200).send("Temperature OK"); } else { res.status(200).send("Too hot"); } } catch (error) { //return an error console.log("got error: ", error); res.status(500).send(error); } };
Możesz teraz przetestować funkcję.
Testowanie funkcji w Visual Studio Code
Od tego momentu to ćwiczenie z programowania korzysta z zintegrowanego terminala w Visual Studio Code.
W Visual Studio Code otwórz okno terminala.
Uruchom to polecenie:
node node_modules/@google-cloud/functions-framework --target=validateTemperature
To polecenie uruchamia serwer lokalny, który jest gotowy do wywołania funkcji validateTemperature
, gdy serwer otrzyma żądanie HTTP.
W oknie terminala powinny się wyświetlić te dane wyjściowe:
Serving function... Function: validateTemperature URL: http://localhost:8080/
Aby utworzyć drugie okno terminala w VS Code, kliknij ikonę plusa New Terminal
w panelu okna terminala. Przełącz się między tymi dwoma oknami terminala: pierwsze służy do obsługi funkcji, a drugie do wywołania funkcji za pomocą curl.
Możesz przełączać się między oknami terminala za pomocą menu. Jeśli okno terminala obsługuje obecnie funkcję, na liście rozwijanej jest ono oznaczone jako node
. W przeciwnym razie jest to zsh
(lub powłoka, której używasz).
W drugim oknie terminala uruchom to polecenie, aby wysłać ładunek danych o temperaturze równy 50 do lokalnego serwera obsługującego funkcję validateTemperature
.
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"50"}'
Powinna się wyświetlić taka odpowiedź z funkcji w chmurze:
Temperature OK
W drugim oknie terminala przetestuj funkcję ponownie, wysyłając ładunek „zbyt wysoka” temperatura, jak pokazano poniżej:
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"120"}'
Powinna się wyświetlić taka odpowiedź z funkcji w chmurze:
Too hot
Na koniec przetestuj funkcję, wywołując ją z brakującym ładunkiem.
curl -X POST http://localhost:8080
Powinna się wyświetlić taka odpowiedź z funkcji w chmurze:
Too hot
W idealnej sytuacji funkcja nie powinna zwracać wartości „too hot” (zbyt gorąco), jeśli nie podano temperatury. odkryjesz błąd w kodzie,
Zatrzymaj funkcję, naciskając Ctrl + C
w pierwszym oknie terminala obsługującym funkcję.
5. Debugowanie funkcji HTTP na komputerze lokalnym
Otwórz paletę poleceń w Visual Studio Code. Jeśli używasz komputera Mac, użyj Cmd + Shift + P
. Jeśli używasz systemu Windows, użyj Ctrl + Shift + P.
Wpisz auto attach
na palecie poleceń i wybierz pierwszy element na liście.
W tym przypadku wybierz Only With Flag
, jak pokazano na obrazie poniżej:
Teraz odśwież okno terminala w VS Code, które zostało użyte do obsługi funkcji, najeżdżając kursorem na ikonę ostrzeżenia wyświetlaną po prawej stronie.
Kliknij Relaunch Terminal
.
W ponownie załadowanym oknie terminala ponownie uruchom interfejs Functions za pomocą tego polecenia:
node --inspect node_modules/.bin/functions-framework --target=validateTemperature
gdzie parametr --inspect
informuje Node.js, aby nasłuchiwał klienta debugowania. Więcej informacji znajdziesz w dokumentacji Node dotyczącej debugowania.
Pamiętaj, że używasz node_modules/.bin/functions-framework zamiast node_modules/@google-cloud/functions-framework. Aby korzystać z trybu inspekcji, musisz użyć automatycznie utworzonego linku do pliku wykonywalnego w katalogu /node_modules/.bin.
Tym razem w VS Code powinien pojawić się pomarańczowy pasek stanu, który wskazuje, że debuger jest podłączony.
Aby ustawić punkt przerwania w wierszu 3, kliknij w marginesie po lewej stronie numeru wiersza.
Ikona punktu przerwania powinna się zaświecić na czerwono, co oznacza, że ten wiersz kodu jest dostępny dla debugera.
W drugim oknie terminala wywołaj punkt przerwania, wykonując to polecenie curl.
curl -X POST http://localhost:8080
Pojawi się żółte wyróżnienie na linii 3. To wyróżnienie wskazuje, że ten wiersz jest bieżącym poleceniem ocenianym przez debuger.
Najeżdżając kursorem na zmienną temp, sprawdź, czy jej zawartość to undefined
, ponieważ żądanie nie zawierało ładunku danych temperatury.
Aby wykonać następne instrukcje, kliknij ikonę pominięcia.
Zobaczysz, że bieżące instrukcje przeskakują do części else instrukcji if.
W tym pokazie możesz założyć, że specyfikacja wymaga, aby wszystkie żądania wysyłały odczyt temperatury. W nieprawdopodobnym przypadku, gdy odczyt temperatury nie zostanie podany, funkcja powinna wyrzucić wyjątek.
Aby odłączyć debuger, kliknij przycisk Odłącz.
W pierwszym oknie terminala zatrzymaj wykonywanie funkcji, naciskając Ctrl + C
.
Zmodyfikuj funkcję, aby dodać instrukcję if, która zgłasza wyjątek, jeśli temperatura jest niezdefiniowana, jak pokazano poniżej:
exports.validateTemperature = async (req, res) => { try { // add this if statement below line #2 if (!req.body.temp) { throw "Temperature is undefined"; } ...
W pierwszym oknie terminala uruchom ponownie funkcję w chmurze, wykonując to polecenie bez flagi –inspect, aby uniknąć dołączania debugera.
node node_modules/@google-cloud/functions-framework --target=validateTemperature
Aby sprawdzić, czy wyjątek został wygenerowany, uruchom w drugim oknie terminala to polecenie:
curl -X POST http://localhost:8080
Powinny się wyświetlić te dane wyjściowe:
Temperature is undefined
W pierwszym oknie terminala zobaczysz też błąd zarejestrowany przez funkcję.
Serving function... Function: validateTemperature URL: http://localhost:8080/ got error: Temperature is undefined
Teraz możesz zatrzymać wykonywanie funkcji, naciskając Ctrl + C w pierwszym oknie terminala.
6. Wdrażanie funkcji HTTP z komputera lokalnego do Google Cloud
Po utworzeniu, przetestowaniu i przejrzeniu funkcji Cloud Functions na komputerze lokalnym możesz ją wdrożyć w Google Cloud.
Aby sprawdzić, czy używasz lokalnie projektu utworzonego w kroku 2, uruchom to polecenie:
gcloud config get-value project
Jeśli projekt podany w kroku 2 nie jest aktywną konfiguracją, uruchom to polecenie:
gcloud config set project <project-name-created-step-2>
W dowolnym oknie terminala uruchom to polecenie:
gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated
gdzie parametry są opisane w ten sposób:
deploy validateTemperature
– podpolecenie gcloud służące do wdrażania funkcji Cloud Functions o nazwievalidateTemperature
z punktem wejścia o nazwievalidateTemperature
--trigger-http
– typ zdarzenia aktywującego,--runtime nodejs12
– docelowy czas działania tej funkcji.--allow-unauthenticated
– umożliwia wywołanie funkcji przez osoby z dostępem publicznym
Pojawi się prośba o włączenie interfejsów Cloud Functions API. Aby włączyć interfejsy API, wpisz y
.
API [cloudfunctions.googleapis.com] not enabled on project [1057316433766]. Would you like to enable and retry (this will take a few minutes)? (y/N)? y
Po zakończeniu wdrażania w danych wyjściowych zobaczysz:
Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 buildId: <your-build-id> entryPoint: validateTemperature httpsTrigger: url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature ...
W oknie terminala wywołaj ten publiczny punkt końcowy za pomocą curl.
curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json" -d '{"temp":"50"}'
i sprawdź, czy funkcja w chmurze została wdrożona, weryfikując odpowiednią odpowiedź.
Temperature OK
7. Czyszczenie danych
Aby uniknąć przypadkowych opłat, np. gdy funkcja Cloud Functions jest nieumyślnie wywoływana więcej razy niż miesięczny limit wywołań funkcji w ramach bezpłatnego poziomu, możesz usunąć funkcję Cloud Functions lub projekt utworzony w kroku 2.
Aby usunąć funkcję w Cloud Functions, otwórz konsolę Cloud Functions pod adresem https://console.cloud.google.com/functions/. Upewnij się, że wybrany jest projekt utworzony w kroku 2.
Wybierz funkcję validateTemperature wdrożona w kroku 6. Następnie kliknij Usuń.
Jeśli chcesz 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. Aby wyświetlić listę wszystkich dostępnych projektów, uruchom polecenie gcloud projects list.
8. Gratulacje!
Gratulujemy ukończenia ćwiczenia. Dowiedz się więcej o tym, jak Cloud Functions obsługuje środowisko wykonawcze Node.js, oraz jak działa debugowanie lokalne w Cloud Functions.
Omówione zagadnienia
- Framework funkcji dla Node.js.
- utworzyć i przetestować lokalnie funkcję HTTP w Cloud Functions.
- Debugowanie funkcji HTTP na komputerze lokalnym.
- Wdróż funkcję HTTP z komputera lokalnego.