Lokalny rozwój funkcji w Cloud Functions dla Node.js za pomocą Visual Studio Code

1. Przegląd

Google Cloud Functions to bezserwerowa platforma obliczeniowa oparta na zdarzeniach. Cloud Functions umożliwia pisanie kodu bez martwienia się o udostępnianie zasobów czy skalowanie w celu obsługi zmieniających się wymagań.

Funkcje w Cloud Functions można tworzyć w języku JavaScript i wykonywać w środowisku Node.js na platformie Google Cloud Platform. Funkcje w Cloud Functions można uruchamiać w dowolnym standardowym środowisku wykonawczym Node.js, co ułatwia przenośność i lokalne testowanie.

Przewodnik

W tym samouczku utworzysz funkcję w Cloud Functions dla Node.js, która będzie informować, czy podana temperatura jest akceptowalna, czy zbyt wysoka. Utworzysz, przetestujesz i zdebugujesz funkcję Cloud Function za pomocą Visual Studio Code na komputerze lokalnym. Na koniec wdrożysz funkcję na platformie Google Cloud Platform.

Czego się nauczysz

  • Functions Framework 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

Koszty

Chociaż ten przewodnik wymaga tylko 1 wywołania wdrożonej funkcji w Cloud Functions, warto zapoznać się z informacjami o cenach interfejsu Cloud Functions API, aby dowiedzieć się, jak działają rozliczenia.

Z wielu interfejsów API Google można korzystać bez opłat, ale korzystanie z Google Cloud Platform (czyli jej usług i interfejsów API) jest pł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łatny”, który musisz przekroczyć, aby ponieść opłaty. Na potrzeby tego laboratorium każde wywołanie Cloud Functions jest wliczane do tego poziomu bezpłatnego. Jeśli nie przekroczysz limitów łącznie (w każdym miesiącu), nie powinny zostać naliczone żadne opłaty.

3. Zainstaluj platformę Functions Framework dla Node.js.

Functions Framework for Node.js to platforma FaaS (funkcje jako usługa) typu open source do pisania przenośnych funkcji Node.js, która jest udostępniana przez zespół Google Cloud Functions.

Functions Framework umożliwia pisanie lekkich funkcji, które działają w wielu różnych środowiskach, w tym:

  • Google Cloud Functions
  • lokalny komputer używany do programowania,
  • Cloud Run i Cloud Run w GKE
  • Środowiska oparte na Knative

Utwórz nową aplikację Node.js.

npm init

Akceptując ustawienia domyślne, upewnij się, że punktem wejścia do aplikacji jest index.js.

Teraz zainstaluj platformę Functions Framework dla Node.js.

npm install @google-cloud/functions-framework

Otwórz plik package.json. Sprawdź, czy platforma funkcji jest wymieniona jako zależność, jak pokazano w przykładzie poniżej.

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

Platforma Functions Framework została zainstalowana. Możesz teraz utworzyć funkcję w Cloud Functions.

4. Tworzenie i testowanie lokalne funkcji HTTP w Cloud Functions

Tworzenie lokalnej funkcji Cloud Function

W tej sekcji utworzysz i przetestujesz funkcję HTTP, która odpowiada na żądania HTTP.

W tym samym katalogu, w którym znajduje się 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 w tym ćwiczeniu będziemy używać 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 lokalny serwer, który jest gotowy do wywołania funkcji validateTemperature, gdy serwer otrzyma żądanie HTTP.

W oknie terminala powinny zostać wyświetlone te 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. Będziesz przełączać się między tymi 2 oknami terminala: pierwszym do obsługi funkcji i drugim do wywoływania funkcji za pomocą polecenia curl.

bceb65f366d837ae.png

Możesz przełączać się między oknami terminala za pomocą menu. Jeśli okno terminala obsługuje obecnie jakąś funkcję, na liście rozwijanej jest ono oznaczone jako node. W przeciwnym razie jest on określany jako zsh (lub powłoka, której używasz).

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

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

Funkcja w chmurze powinna zwrócić taką odpowiedź:

Temperature OK

W drugim oknie terminala ponownie przetestuj funkcję, wysyłając ładunek z „zbyt wysoką” temperaturą, jak pokazano poniżej:

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

Funkcja w chmurze powinna zwrócić taką odpowiedź:

Too hot

Na koniec przetestuj funkcję, wywołując ją z brakującym ładunkiem.

curl -X POST http://localhost:8080

Funkcja w chmurze powinna zwrócić taką odpowiedź:

Too hot

W idealnej sytuacji funkcja nie powinna zwracać wartości „zbyt gorąco”, jeśli nie podano temperatury. Wykrywasz błąd w kodzie.

Zatrzymaj działanie funkcji, naciskając Ctrl + C w pierwszym oknie terminala, w którym działa funkcja.

5. Debugowanie funkcji HTTP na komputerze lokalnym

Otwórz paletę poleceń w Visual Studio Code. Jeśli korzystasz z komputera Mac, użyj klawisza Cmd + Shift + P. Jeśli korzystasz z systemu Windows, użyj Ctrl + Shift + P.

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

601e542b4ec9f6f9.png

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

b9e6b762d150e62b.png

Teraz ponownie załaduj okno terminala użyte w VS Code do obsługi funkcji, najeżdżając kursorem na ikonę ostrzeżenia, która pojawia się po prawej stronie.

Kliknij Relaunch Terminal.

37b61e3fb546fc76.png

W ponownie załadowanym oknie terminala ponownie uruchom platformę funkcji, aby udostępnić 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 Node.js na temat debugowania.

Zwróć uwagę, że używasz node_modules/.bin/functions-framework zamiast node_modules/@google-cloud/functions-framework. Aby używać trybu inspekcji, musisz użyć automatycznie połączonego symbolicznie pliku wykonywalnego w katalogu /node_modules/.bin.

Tym razem w VS Code powinien pojawić się pomarańczowy pasek stanu z informacją, że debuger jest podłączony.

Ustaw punkt przerwania w wierszu 3, klikając margines po lewej stronie numeru wiersza.

2fbb4d5916e1dbfa.png

Ikona punktu przerwania powinna świecić na jasnoczerwono, co oznacza, że ta linia kodu jest dostępna dla debugera.

846e6c5993cc87f9.png

W drugim oknie terminala zatrzymaj się w punkcie przerwania, uruchamiając to polecenie curl.

curl -X POST http://localhost:8080 

Wiersz 3 zostanie wyróżniony na żółto. To wyróżnienie oznacza, że ten wiersz jest obecnie oceniany przez debuger.

206c7ed1eb189e90.png

Najedź kursorem na zmienną tymczasową, aby sprawdzić, czy jej zawartość to undefined, ponieważ żądanie nie zawierało ładunku temperatury.

97979025f4bf2842.png

Kliknij ikonę przejścia, aby wykonać następną instrukcję.

Bieżąca instrukcja przejdzie do części else instrukcji if.

cf0e8ce7e0388f98.png

Na potrzeby tej wersji demonstracyjnej możesz założyć, że specyfikacja wymaga, aby wszystkie żądania wysyłały odczyt temperatury. W mało prawdopodobnym przypadku, gdy odczyt temperatury nie jest dostępny, funkcja powinna zgłosić wyjątek.

Aby odłączyć debuger, kliknij przycisk Odłącz.

1070d059775ad769.png

W pierwszym oknie terminala zatrzymaj działanie funkcji, naciskając Ctrl + C.

Zaktualizuj funkcję, aby dodać instrukcję if, która zgłosi 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 ponownie uruchom funkcję w chmurze, wykonując to polecenie bez flagi –inspect, aby uniknąć dołączenia debugera.

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Sprawdź, czy został zgłoszony wyjątek, uruchamiając 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ć działanie funkcji, naciskając Ctrl + C w pierwszym oknie terminala.

6. Wdrażanie funkcji HTTP z komputera lokalnego 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 używasz 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 to polecenie:

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

gdzie parametry są wyjaśnione w ten sposób:

  • deploy validateTemperature – podpolecenie 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 – docelowe środowisko wykonawcze tej funkcji.
  • --allow-unauthenticated – umożliwia publiczny dostęp do wywoływania 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 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 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 sprawdź, czy funkcja w Cloud Functions została wdrożona, weryfikując odpowiednią odpowiedź.

Temperature OK

7. Czyszczenie danych

Aby uniknąć przypadkowych opłat, np. gdy ta funkcja w Cloud Functions zostanie przypadkowo wywołana więcej razy niż miesięczny limit wywołań funkcji w Cloud Functions w ramach bezpłatnej wersji, możesz usunąć funkcję w Cloud Functions lub projekt utworzony w kroku 2.

Aby usunąć funkcję Cloud, otwórz konsolę Cloud Function pod adresem https://console.cloud.google.com/functions/. Upewnij się, że projekt utworzony w kroku 2 jest obecnie wybranym projektem.

Wybierz funkcję validateTemperature wdrożoną w kroku 6. Następnie kliknij Usuń.

4dada486485a935a.png

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. 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 i jak działa lokalne debugowanie w Cloud Functions.

Omówione zagadnienia

  • Functions Framework dla Node.js.
  • utworzyć i przetestować lokalnie funkcję HTTP w Cloud Functions,
  • Debugowanie funkcji HTTP na komputerze lokalnym.
  • Wdróż funkcję HTTP z komputera lokalnego.