Programowanie lokalne z użyciem Cloud Functions dla Node.js z użyciem Visual Studio Code

1. Omówienie

Google Cloud Functions to bezserwerowa platforma obliczeniowa oparta na zdarzeniach. Cloud Functions umożliwia pisanie kodu bez obaw o udostępnianie zasobów czy skalowanie pod kątem zmieniających się wymagań.

Funkcje w Cloud Functions napisane w języku JavaScript są wykonywane w środowisku Node.js w Google Cloud Platform. Aby umożliwić przenoszenie i testowanie lokalne, możesz uruchomić funkcję w Cloud Functions w dowolnym standardowym środowisku wykonawczym Node.js.

Przewodnik

W ramach tego ćwiczenia w Codelabs utworzysz funkcję w Cloud Functions dla środowiska Node.js, która będzie zgłaszać, czy określona temperatura jest akceptowalna czy zbyt gorąca. 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.
  • lokalnie utworzysz i przetestujesz funkcję HTTP w Cloud Functions;
  • Debugowanie funkcji HTTP na komputerze lokalnym.
  • Wdróż funkcję HTTP na komputerze lokalnym.

2. Konfiguracja i wymagania

Wymagania wstępne

Koszty

Chociaż to ćwiczenie w Codelabs wymaga tylko 1 wywołania wdrożonej funkcji w Cloud Functions, zapoznaj się z informacjami o cenach interfejsu Cloud Functions API, aby zrozumieć, jak działają płatności.

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. Jeśli łącznie nie przekroczysz limitu (w ciągu miesiąca), nie poniesiesz żadnych opłat.

3. Instalowanie platformy Functions dla Node.js

Platforma funkcji dla Node.js to platforma open source FaaS (funkcja jako usługa), która służy do tworzenia przenośnych funkcji Node.js. Została przy tym zwracana przez 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

Akceptując wartości domyślne, pamiętaj, aby jako punktu wejścia dla swojej aplikacji użyć index.js.

Teraz zainstaluj platformę funkcji 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"
 }

Platforma funkcji została zainstalowana. 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 następujące elementy:

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ć tę funkcję.

Testowanie funkcji w kodzie Visual Studio

Od tej pory to ćwiczenie w Codelabs korzysta ze zintegrowanego terminala w kodzie Visual Studio.

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ływania funkcji validateTemperature, gdy serwer otrzyma żądanie HTTP.

W oknie terminala powinny wyświetlić się następujące dane wyjściowe:

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

Utwórz drugie okno terminala w VS Code, klikając ikonę plusa New Terminal w panelu okna terminala. Przełączaj się między tymi dwoma oknami terminala: pierwsze służy do obsługi funkcji, a drugie do wywołania funkcji za pomocą curl.

bceb65f366d837ae.png

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 ona oznaczona jako node. W przeciwnym razie jest to zsh (lub powłoka, której używasz).

W drugim oknie terminala uruchom poniższe polecenie, aby wysłać ładunek temperatury o wartości 50 do serwera lokalnego obsługującego funkcję validateTemperature.

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

Z funkcji w Cloud Functions powinna wyświetlić się ta odpowiedź:

Temperature OK

W drugim oknie terminala jeszcze raz przetestuj funkcję, wysyłając ładunek przedstawiający zbyt wysoką temperaturę, jak 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

Z funkcji w Cloud Functions powinna wyświetlić się ta odpowiedź:

Too hot

W idealnym przypadku funkcja nie powinna zwracać wartości „za gorąco”, jeśli nie podano temperatury. Odkryłeś błąd w kodzie.

Pamiętaj, aby zatrzymać uruchamianie funkcji, naciskając Ctrl + C w pierwszym oknie terminala obsługującego Twoją 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. W systemie Windows użyj Ctrl + Shift + P.

Wpisz auto attach na palecie poleceń i wybierz pierwszy element na liście.

601e542b4ec9f6f9.png

W tym przypadku wybierz Only With Flag, jak pokazano na obrazie poniżej:

b9e6b762d150e62b.png

Teraz ponownie załaduj okno terminala użyte w VS Code, aby obsługiwać swoją funkcję. Aby to zrobić, najedź kursorem na ikonę ostrzeżenia widoczną po prawej stronie.

Kliknij Relaunch Terminal.

37b61e3fb546fc76.png

W ponownie załadowanym oknie terminala uruchom ponownie platformę funkcji, aby uruchomić funkcję za pomocą tego polecenia:

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

gdzie flaga --inspect informuje Node.js, że ma nasłuchiwać klienta debugowania. Więcej informacji znajdziesz w dokumentacji węzłów na temat debugowania.

Pamiętaj, że używasz node_modules/.bin/functions-framework zamiast node_modules/@google-cloud/functions-framework. Aby skorzystać z trybu inspekcji, musisz użyć automatycznie połączonego symbolem pliku wykonywalnego w katalogu /node_modules/.bin.

Tym razem w VS Code powinien być widoczny pomarańczowy pasek stanu wskazujący, że debuger jest podłączony.

Ustaw punkt przerwania w wierszu 3, klikając margines na lewo od numeru wiersza.

2fbb4d5916e1dbfa.png

Ikona punktu przerwania powinna zaświecić się na jasnoczerwono, co oznacza, że debuger ma dostęp do tego wiersza kodu.

846e6c5993cc87f9.png

W drugim oknie terminala kliknij punkt przerwania, uruchamiając następujące polecenie curl.

curl -X POST http://localhost:8080 

Nad wierszem 3 pojawi się żółte wyróżnienie. To wyróżnienie oznacza, że ten wiersz jest bieżącą instrukcją ocenianą przez debuger.

206c7ed1eb189e90.png

Najeżdżając kursorem na zmienną temp, sprawdź, czy jej zawartość to undefined, ponieważ żądanie nie zawierało ładunku danych temperatury.

97979025f4bf2842.png

Aby wykonać następne instrukcje, kliknij ikonę pominięcia.

Bieżąca instrukcja przeskoczy do innej części instrukcji if.

cf0e8ce7e0388f98.png

W tej wersji demonstracyjnej możesz przyjąć, ż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.

1070d059775ad769.png

W pierwszym oknie terminala zatrzymaj obsługę funkcji, naciskając Ctrl + C.

Zaktualizuj swoją funkcję, dodając instrukcję if, która zgłasza wyjątek, jeśli temperatura jest niezdefiniowana, tak jak 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 Twoją 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 na komputerze lokalnym w Google Cloud

Po utworzeniu, przetestowaniu i debugowaniu funkcji w Cloud Functions na komputerze lokalnym możesz ją wdrożyć w Google Cloud.

Sprawdź, czy korzystasz z projektu utworzonego w kroku 2 lokalnie, uruchamiając to polecenie:

gcloud config get-value project

Jeśli projekt określony w kroku 2 nie jest aktywną konfiguracją, uruchom to polecenie:

gcloud config set project <project-name-created-step-2>

W dowolnym oknie terminala uruchom następujące polecenie:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

gdzie parametry są opisane w ten sposób:

  • deploy validateTemperature – polecenie podrzędne gcloud do wdrażania funkcji w Cloud Functions o nazwie validateTemperature z punktem wejścia o nazwie validateTemperature.
  • --trigger-http – typ zdarzenia aktywującego,
  • --runtime nodejs12 – docelowy czas działania tej funkcji
  • --allow-unauthenticated – umożliwia dostęp publiczny do wywołania funkcji

Pojawi się prośba o włączenie interfejsów Cloud Functions API. Wpisz y, aby włączyć interfejsy API.

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 pojawią się następujące dane:

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 użyj polecenia curl, aby wywołać ten publiczny punkt końcowy.

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

i potwierdź, czy Twoja funkcja w Cloud Functions została wdrożona, weryfikując odpowiednią odpowiedź.

Temperature OK

7. Czyszczenie danych

Aby uniknąć niezamierzonych opłat, np. gdy ta funkcja w Cloud Functions jest nieumyślnie wywoływana więcej razy niż miesięczny przydział wywołań funkcji w Cloud Functions na poziomie bezpłatnym, możesz usunąć funkcję w 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ę weryfikacji temperatury wdrożoną w kroku 6. Następnie kliknij Usuń.

4dada486485a935a.png

Jeśli zdecydujesz się usunąć cały projekt, możesz otworzyć stronę https://console.cloud.google.com/cloud-resource-manager, wybrać projekt utworzony w kroku 2 i kliknąć 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 ćwiczeń z programowania. 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

  • Platforma funkcji dla Node.js.
  • lokalnie utworzysz i przetestujesz funkcję HTTP w Cloud Functions;
  • Debugowanie funkcji HTTP na komputerze lokalnym.
  • Wdróż funkcję HTTP ze swojego komputera.