1. Przegląd
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 ćwiczeniu pokażemy, jak bezpiecznie połączyć aplikację Node.js w Cloud Run z AlloyDB za pomocą konta usługi z uwierzytelnianiem IAM.
Czego się nauczysz
W tym module nauczysz się, jak:
- Tworzenie instancji AlloyDB (skonfigurowanej do korzystania z Private Service Connect)
- Wdrażanie aplikacji w Cloud Run, która łączy się z instancją AlloyDB
2. Wymagania wstępne
- Jeśli nie masz jeszcze konta Google, musisz je utworzyć.
- Używaj konta osobistego zamiast konta służbowego lub szkolnego. Konta służbowe i szkolne mogą mieć ograniczenia, które uniemożliwiają włączenie interfejsów API potrzebnych do tego ćwiczenia.
3. Konfigurowanie projektu
- Zaloguj się w konsoli Google Cloud.
- Włącz płatności w konsoli Google Cloud.
- Pod względem opłat za zasoby chmury ukończenie tego modułu powinno kosztować mniej niż 1 USD.
- Jeśli chcesz uniknąć dalszych opłat, wykonaj czynności opisane na końcu tego modułu, aby usunąć zasoby.
- Nowi użytkownicy mogą skorzystać z bezpłatnego okresu próbnego o wartości 300 USD.
- Utwórz nowy projekt lub użyj już istniejącego.
4. Otwórz edytor Cloud Shell
- Otwórz edytor Cloud Shell.
- Jeśli terminal nie pojawia się u dołu ekranu, otwórz go:
- Kliknij menu
. - Kliknij Terminal.
- Kliknij Nowy terminal
.
- Kliknij menu
- W terminalu ustaw projekt za pomocą tego polecenia:
- Format:
gcloud config set project [PROJECT_ID] - Przykład:
gcloud config set project lab-project-id-example - Jeśli nie pamiętasz identyfikatora projektu:
- Aby wyświetlić listę wszystkich identyfikatorów projektów, użyj tego polecenia:
gcloud projects list | awk '/PROJECT_ID/{print $2}'

- Aby wyświetlić listę wszystkich identyfikatorów projektów, użyj tego polecenia:
- Format:
- Jeśli pojawi się prośba o autoryzację, kliknij Autoryzuj, aby przejść dalej.

- Powinien wyświetlić się ten komunikat:
Jeśli widzisz symbolUpdated property [core/project].
WARNINGi pojawia się pytanieDo you want to continue (Y/N)?, prawdopodobnie identyfikator projektu został wpisany nieprawidłowo. NaciśnijN, a następnieEnteri spróbuj ponownie uruchomić poleceniegcloud config set project.
5. Włącz interfejsy API
W terminalu włącz interfejsy API:
gcloud services enable \
compute.googleapis.com \
alloydb.googleapis.com \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
cloudaicompanion.googleapis.com
Jeśli pojawi się prośba o autoryzację, kliknij Autoryzuj, aby przejść dalej. 
Wykonanie tego polecenia może potrwać kilka minut, ale powinno ostatecznie wyświetlić komunikat o sukcesie podobny do tego:
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
6. 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 AlloyDB.
- Aby utworzyć nowe konto usługi, uruchom polecenie
gcloud iam service-accounts createw ten sposób:gcloud iam service-accounts create quickstart-service-account \ --display-name="Quickstart Service Account" - Aby dodać rolę Użytkownik bazy danych AlloyDB do utworzonego właśnie konta usługi Google Cloud, wykonaj to polecenie:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/alloydb.databaseUser" - Aby dodać do utworzonego właśnie konta usługi Google Cloud rolę konsument Wykorzystania usług, wykonaj to polecenie: gcloud projects add-iam-policy-binding
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/serviceusage.serviceUsageConsumer" - 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"
7. Tworzenie bazy danych AlloyDB
- Uruchom polecenie
gcloud alloydb clusters create, aby utworzyć instancję Cloud SQL.gcloud alloydb clusters create quickstart-cluster \ --password=$(openssl rand -base64 20) \ --region=us-central1 \ --project=${GOOGLE_CLOUD_PROJECT} \ --enable-private-service-connect \ --database-version=POSTGRES_16
Wykonanie tego polecenia może potrwać kilka minut.
- Uruchom polecenie
gcloud alloydb instances create, aby utworzyć instancję Cloud SQL.gcloud alloydb instances create quickstart-instance \ --project=${GOOGLE_CLOUD_PROJECT} \ --instance-type=PRIMARY \ --cpu-count=2 \ --region=us-central1 \ --cluster=quickstart-cluster \ --allowed-psc-projects=${GOOGLE_CLOUD_PROJECT} \ --database-flags=alloydb.iam_authentication=on - Uruchom polecenie
gcloud alloydb instances describe, aby uzyskać link do przyłącza usługi PSC i wyeksportować go do zmiennej.export SERVICE_ATTACHMENT=$(gcloud alloydb instances describe quickstart-instance \ --cluster=quickstart-cluster --region=us-central1 \ --format="value(pscInstanceConfig.serviceAttachmentLink)") gcloud compute addresses create quickstart-address \ --region=us-central1 \ --subnet=defaultgcloud compute forwarding-rules create quickstart-endpoint \ --region=us-central1 \ --network=default \ --address=quickstart-address \ --target-service-attachment=${SERVICE_ATTACHMENT}
Utwórz użytkownika bazy danych PostgreSQL dla utworzonego wcześniej konta usługi, aby uzyskać dostęp do bazy danych.
gcloud alloydb users create quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam \
--cluster=quickstart-cluster \
--region=us-central1 \
--type=IAM_BASED \
--superuser=true
8. Przygotowywanie aplikacji
Przygotuj aplikację Node.js, która odpowiada na żądania HTTP.
- W Cloud Shell utwórz nowy katalog o nazwie
helloworld, a następnie przejdź do niego:mkdir helloworld cd helloworld - Zainicjuj plik
package.jsonjako moduł.npm init -y npm pkg set type="module" npm pkg set main="index.mjs" npm pkg set scripts.start="node index.mjs" - Zainstaluj bibliotekę Google Cloud Auth.
npm install google-auth-library - Zainstaluj
pg, aby korzystać z bazy danych PostgreSQL.npm install pg - Zainstaluj express, aby akceptować przychodzące żądania HTTP.
npm install express - Utwórz plik
index.mjsz kodem aplikacji. Ten kod może:- Akceptowanie żądań HTTP
- Łączenie z bazą danych
- Zapisywanie czasu żądania HTTP w bazie danych
- Zwraca czasy ostatnich 5 żądań
cat > index.mjs << "EOF" import express from 'express'; import pg from 'pg'; const { Pool } = pg; import {GoogleAuth} from 'google-auth-library'; const auth = new GoogleAuth({ scopes: ['https://www.googleapis.com/auth/alloydb.login'], }); const pool = new Pool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: async () => { return await auth.getAccessToken(); }, database: process.env.DB_NAME, ssl: { require: true, rejectUnauthorized: false, // required for self-signed certs // https://node-postgres.com/features/ssl#self-signed-cert } }); 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.
9. Wdrażanie aplikacji Cloud Run
- Aby wdrożyć aplikację w Cloud Run, uruchom to polecenie:
gcloud run deploy helloworld \ --region=us-central1 \ --source=. \ --set-env-vars DB_NAME="quickstart_db" \ --set-env-vars DB_USER="postgres" \ --set-env-vars DB_PASSWORD=${DB_PASSWORD} \ --set-env-vars DB_HOST="$(gcloud sql instances describe quickstart-instance --project=${GOOGLE_CLOUD_PROJECT} --format='value(settings.ipConfiguration.pscConfig.pscAutoConnections.ipAddress)')" \ --service-account="quickstart-service-account@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --network=default \ --subnet=default \ --allow-unauthenticated - Jeśli pojawi się taka prośba, naciśnij
YiEnter, 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.
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.
10. Gratulacje
Z tego laboratorium dowiedziałeś(-aś) się, jak:
- Tworzenie instancji AlloyDB (skonfigurowanej do korzystania z Private Service Connect)
- Wdrażanie aplikacji w Cloud Run, która łączy się z instancją AlloyDB
Czyszczenie danych
Cloud SQL nie ma bezpłatnego poziomu i jeśli będziesz nadal z niego korzystać, zostaniesz obciążony opłatami. Aby uniknąć dodatkowych opłat, możesz usunąć projekt w chmurze.
Cloud Run nie nalicza opłat, gdy usługa nie jest używana, ale może zostać pobrana należność za przechowywanie obrazu kontenera w Artifact Registry. Usunięcie projektu w chmurze powoduje zaprzestanie naliczania opłat za wszelkie zasoby wykorzystywane w ramach tego projektu.
Jeśli chcesz, usuń projekt:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
Możesz też usunąć niepotrzebne zasoby z dysku Cloud Shell. Możesz:
- Usuń katalog projektu ćwiczeń z programowania:
rm -rf ~/task-app - Ostrzeżenie! Tej czynności nie będzie można cofnąć. Jeśli chcesz usunąć wszystko z Cloud Shell, aby zwolnić miejsce, możesz usunąć cały katalog domowy. Upewnij się, że wszystko, co chcesz zachować, jest zapisane w innym miejscu.
sudo rm -rf $HOME
Kontynuuj naukę
- Wdrażanie aplikacji Next.js full stack w Cloud Run z Cloud SQL for PostgreSQL przy użyciu oprogramowania sprzęgającego Cloud SQL Node.js
- Wdrażanie aplikacji Angular full stack w Cloud Run z Cloud SQL for PostgreSQL przy użyciu oprogramowania sprzęgającego Cloud SQL Node.js
- Wdrażanie aplikacji Angular full stack w Cloud Run z Firestore przy użyciu pakietu Admin SDK Node.js
- Wdrażanie aplikacji Next.js full stack w Cloud Run z Firestore przy użyciu pakietu Admin SDK Node.js