Jak połączyć aplikację Node.js w Cloud Run z bazą danych Cloud SQL for PostgreSQL

1. Przegląd

Oprogramowanie sprzęgające Cloud SQL Node.js to najprostszy sposób na bezpieczne połączenie aplikacji Node.js z bazą danych Cloud SQL. Cloud Run to w pełni zarządzana platforma bezserwerowa, która umożliwia uruchamianie bezstanowych kontenerów wywoływanych przez żądania HTTP. W tym laboratorium dowiesz się, jak bezpiecznie połączyć aplikację Node.js w Cloud Run z bazą danych Cloud SQL for PostgreSQL za pomocą konta usługi z uwierzytelnianiem IAM.

Czego się nauczysz

W tym module nauczysz się:

  • Tworzenie instancji Cloud SQL dla bazy danych PostgreSQL
  • Wdrażanie aplikacji Node.js w Cloud Run
  • Łączenie aplikacji z bazą danych za pomocą biblioteki Cloud SQL Node.js Connector

Wymagania wstępne

  • Zakładamy, że użytkownik zna środowiska konsoli Cloud i Cloud Shell.

2. Zanim zaczniesz

Konfigurowanie projektu w Google Cloud

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Google, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Możesz ją zaktualizować w dowolnym momencie.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle jest on oznaczony jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i będzie obowiązywać przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, czyli numer projektu, z której korzystają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. 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.

Konfiguracja środowiska

Aktywuj Cloud Shell, klikając ikonę po prawej stronie paska wyszukiwania.

ecdc43ada29e91b.png

W Cloud Shell włącz interfejsy API:

gcloud services enable compute.googleapis.com sqladmin.googleapis.com \
  run.googleapis.com artifactregistry.googleapis.com \
  cloudbuild.googleapis.com servicenetworking.googleapis.com

Jeśli pojawi się prośba o autoryzację, kliknij „Autoryzuj”, aby kontynuować.

6356559df3eccdda.png

Wykonanie tego polecenia może potrwać kilka minut, ale powinno ostatecznie wyświetlić komunikat o sukcesie podobny do tego:

Operation "operations/acf.p2-327036483151-73d90d00-47ee-447a-b600-a6badf0eceae" finished successfully.

3. Konfigurowanie konta usługi

Utwórz i skonfiguruj konto usługi Google Cloud, które będzie używane przez Cloud Run, aby miało odpowiednie uprawnienia do łączenia się z Cloud SQL.

  1. Aby utworzyć nowe konto usługi, uruchom polecenie gcloud iam service-accounts create w ten sposób:
    gcloud iam service-accounts create quickstart-service-account \
      --display-name="Quickstart Service Account"
    
  2. Aby dodać do utworzonego właśnie konta usługi Google Cloud rolę Klient Cloud SQL, uruchom polecenie gcloud projects add-iam-policy-binding w ten sposób: W Cloud Shell wyrażenie ${GOOGLE_CLOUD_PROJECT} zostanie zastąpione nazwą Twojego projektu. Możesz też dokonać wymiany ręcznie, jeśli wolisz.
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/cloudsql.client"
    
  3. Aby dodać rolę Użytkownik instancji Cloud SQL do utworzonego właśnie konta usługi Google Cloud, uruchom polecenie gcloud projects add-iam-policy-binding w ten sposób:
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/cloudsql.instanceUser"
    
  4. Aby dodać rolę Zapisujący dzienniki do utworzonego przed chwilą konta usługi Google Cloud, uruchom polecenie gcloud projects add-iam-policy-binding w ten sposób:
    gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
      --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    

4. Konfigurowanie Cloud SQL

Uruchom polecenie gcloud sql instances create, aby utworzyć instancję Cloud SQL.

  • --database-version: typ i wersja silnika bazy danych. Jeśli nie zostanie określony, używana będzie wartość domyślna interfejsu API. Aktualnie dostępne wersje znajdziesz w dokumentacji gcloud dotyczącej wersji bazy danych.
  • --cpu: liczba rdzeni, które mają być dostępne na maszynie.
  • --memory: liczba całkowita wskazująca, ile pamięci ma mieć maszyna. Należy podać jednostkę rozmiaru (np. 3072 MB lub 9 GB). Jeśli nie podasz jednostek, przyjmuje się GB.
  • --region: regionalna lokalizacja instancji (np. us-central1, asia-east1, us-east1);
  • --database-flags: umożliwia ustawianie flag. W tym przypadku włączamy cloudsql.iam_authentication, aby umożliwić Cloud Run łączenie się z Cloud SQL za pomocą utworzonego wcześniej konta usługi.
    gcloud sql instances create quickstart-instance \
      --database-version=POSTGRES_18 \
      --tier=db-custom-1-3840 \
      --region=us-central1 \
      --edition=ENTERPRISE \
      --database-flags=cloudsql.iam_authentication=on
    

Wykonanie tego polecenia może potrwać kilka minut.

Aby utworzyć bazę danych Cloud SQL w quickstart-instance, uruchom polecenie gcloud sql databases create.

gcloud sql databases create quickstart_db \
  --instance=quickstart-instance

Utwórz użytkownika bazy danych PostgreSQL dla utworzonego wcześniej konta usługi, aby uzyskać dostęp do bazy danych.

gcloud sql users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
  --instance=quickstart-instance \
  --type=cloud_iam_service_account \
  --database-roles=postgres

Ostrzeżenie: nie używaj --database-roles=postgres w aplikacjach produkcyjnych. Używamy tego, aby zapewnić uprawnienia potrzebne do programowego tworzenia i usuwania tabel na potrzeby kodu w tym module.

5. Przygotowywanie aplikacji

Przygotuj aplikację Node.js, która odpowiada na żądania HTTP.

  1. W Cloud Shell utwórz nowy katalog o nazwie helloworld, a następnie przejdź do tego katalogu:
    mkdir helloworld
    cd helloworld
    
  2. Inicjowanie pliku package.json jako modułu.
    npm init -y
    npm pkg set type="module"
    npm pkg set main="index.mjs"
    npm pkg set scripts.start="node index.mjs"
    
  3. Zainstaluj zależność łącznika Cloud SQL Node.js.
    npm install @google-cloud/cloud-sql-connector
    
  4. Zainstaluj pg, aby korzystać z bazy danych PostgreSQL.
    npm install pg
    
  5. Zainstaluj express, aby akceptować przychodzące żądania HTTP.
    npm install express
    
  6. Utwórz plik index.mjs z kodem aplikacji. Ten kod może:
    • Akceptowanie żądań HTTP
    • Łączenie z bazą danych
    • Przechowywanie czasu żądania HTTP w bazie danych
    • Zwraca czasy ostatnich 5 żądań
    Uruchom w Cloud Shell to polecenie:
    cat > index.mjs << "EOF"
    import express from 'express';
    import pg from 'pg';
    import {Connector} from '@google-cloud/cloud-sql-connector';
    
    const {Pool} = pg;
    
    const connector = new Connector();
    const clientOpts = await connector.getOptions({
        instanceConnectionName: process.env.INSTANCE_CONNECTION_NAME,
        authType: 'IAM'
    });
    
    const pool = new Pool({
        ...clientOpts,
        user: process.env.DB_USER,
        database: process.env.DB_NAME
    });
    
    const app = express();
    
    app.get('/', async (req, res) => {
      await pool.query('INSERT INTO visits(created_at) VALUES(NOW())');
      const {rows} = await pool.query('SELECT created_at FROM visits ORDER BY created_at DESC LIMIT 5');
      console.table(rows); // prints the last 5 visits
      res.send(rows);
    });
    
    const port = parseInt(process.env.PORT) || 8080;
    app.listen(port, async () => {
      console.log('process.env: ', process.env);
      await pool.query(`CREATE TABLE IF NOT EXISTS visits (
        id SERIAL NOT NULL,
        created_at timestamp NOT NULL,
        PRIMARY KEY (id)
      );`);
      console.log(`helloworld: listening on port ${port}`);
    });
    
    EOF
    

Ten kod tworzy podstawowy serwer WWW, który nasłuchuje na porcie określonym przez zmienną środowiskową PORT. Aplikacja jest teraz gotowa do wdrożenia.

6. Wdrażanie aplikacji Cloud Run

Aby wdrożyć aplikację w Cloud Run, uruchom to polecenie:

  • --region: regionalna lokalizacja instancji (np. us-central1, asia-east1, us-east1);
  • --source: kod źródłowy do wdrożenia. W tym przypadku . odnosi się do kodu źródłowego w bieżącym folderze helloworld.
  • --set-env-vars: ustawia zmienne środowiskowe używane przez aplikację do kierowania jej do bazy danych Cloud SQL.
  • --service-account: wiąże wdrożenie Cloud Run z kontem usługi z uprawnieniami do łączenia się z bazą danych Cloud SQL utworzoną na początku tego Codelabu.
  • --allow-unauthenticated: umożliwia nieuwierzytelnione żądania, dzięki czemu aplikacja jest dostępna w internecie.
gcloud run deploy helloworld \
  --region=us-central1 \
  --source=. \
  --set-env-vars INSTANCE_CONNECTION_NAME="${GOOGLE_CLOUD_PROJECT}:us-central1:quickstart-instance" \
  --set-env-vars DB_NAME="quickstart_db" \
  --set-env-vars DB_USER="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam" \
  --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
  --allow-unauthenticated

Jeśli pojawi się prośba, naciśnij yEnter, aby potwierdzić, że chcesz kontynuować:

Do you want to continue (Y/n)? y

Po kilku minutach aplikacja powinna podać adres URL, który możesz otworzyć.

Otwórz adres URL, aby zobaczyć działanie aplikacji. Za każdym razem, gdy otworzysz adres URL lub odświeżysz stronę, zobaczysz 5 ostatnich wizyt zwróconych w formacie JSON.

7. Gratulacje

Masz wdrożoną w Cloud Run aplikację Node.js, która może łączyć się z bazą danych PostgreSQL działającą w Cloud SQL.

Omówione zagadnienia:

  • Tworzenie bazy danych Cloud SQL for PostgreSQL
  • Wdrażanie aplikacji Node.js w Cloud Run
  • Łączenie aplikacji z Cloud SQL za pomocą łącznika Cloud SQL Node.js

Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym samouczku, możesz usunąć projekt zawierający te zasoby lub zachować projekt i usunąć poszczególne zasoby. Jeśli chcesz usunąć cały projekt, możesz uruchomić to polecenie:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}