1. Omówienie
Cloud Run to w pełni zarządzana bezserwerowa platforma, która umożliwia uruchamianie bezstanowych kontenerów wywoływanych przez żądania HTTP. W tym ćwiczeniu z programowania pokażemy, jak bezpiecznie połączyć aplikację Node.js w Cloud Run z AlloyDB za pomocą konta usługi i uwierzytelniania IAM.
Czego się nauczysz
W tym module nauczysz się, jak:
- Utwórz instancję AlloyDB (skonfigurowaną do korzystania z usługi Private Service Connect).
- Wdrażanie w Cloud Run aplikacji, która łączy się z Twoją instancją AlloyDB
- Dodawanie funkcji do aplikacji za pomocą Gemini Code Assist
2. Wymagania wstępne
- Jeśli nie masz jeszcze konta Google, utwórz je.
- Używasz konta osobistego, a nie służbowego ani szkolnego. Konta służbowe i szkolne mogą mieć ograniczenia, które uniemożliwiają włączenie interfejsów API potrzebnych w tym laboratorium.
3. Konfigurowanie projektu
- Zaloguj się w konsoli Google Cloud.
- Włącz rozliczenia w Cloud Console.
- Ukończenie tego ćwiczenia powinno kosztować mniej niż 1 USD w zasobach Cloud.
- Aby uniknąć dalszych opłat, możesz usunąć zasoby, wykonując czynności podane na końcu tego laboratorium.
- Nowi użytkownicy mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.
- Utwórz nowy projekt lub użyj 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 z 3 kreskami
- Kliknij Terminal.
- Kliknij Nowy terminal
.
- Kliknij menu z 3 kreskami
- W terminalu skonfiguruj 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ć wszystkie identyfikatory projektów, użyj:
gcloud projects list | awk '/PROJECT_ID/{print $2}'
- Aby wyświetlić wszystkie identyfikatory projektów, użyj:
- Format:
- Jeśli pojawi się pytanie o autoryzację, kliknij Autoryzuj, aby kontynuować.
- Powinien wyświetlić się ten komunikat:
Jeśli widziszUpdated property [core/project].
WARNING
i pojawia się pytanieDo you want to continue (Y/N)?
, prawdopodobnie nieprawidłowo wpisano identyfikator projektu. NaciśnijN
, naciśnijEnter
i spróbuj ponownie uruchomić poleceniegcloud config set project
.
5. Włącz interfejsy API
Włącz w terminalu te 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ę pytanie o autoryzację, kliknij Autoryzuj, aby kontynuować.
Wykonanie tego polecenia może potrwać kilka minut, ale ostatecznie powinno wyświetlić komunikat 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, tak aby miało odpowiednie uprawnienia do nawiązywania połączeń z AlloyDB.
- 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"
- Aby dodać do utworzonego właśnie konta usługi Google Cloud rolę Użytkownik bazy danych AlloyDB, wykonaj 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/alloydb.databaseUser"
- Aby dodać do utworzonego właśnie konta usługi Google Cloud rolę Konsument wykorzystania usługi, wykonaj 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/serviceusage.serviceUsageConsumer"
- Aby dodać rolę Autor logów 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 instancji AlloyDB
- Aby utworzyć instancję Cloud SQL, uruchom polecenie
gcloud alloydb clusters create
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.
- Aby utworzyć instancję Cloud SQL, uruchom polecenie
gcloud alloydb instances create
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 załącznika 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=default
gcloud 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. Przygotowanie aplikacji
Przygotuj aplikację Node.js, która odpowiada na żądania HTTP.
- W Cloud Shell utwórz nowy katalog o nazwie
helloworld
i przejdź do tego katalogu:mkdir helloworld cd helloworld
- 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"
- 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.mjs
z 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 dodać rolę Użytkownik sieci do konta usługi Cloud Run dla tworzonej usługi Cloud Run, wykonaj polecenie gcloud projects add-iam-policy-binding w ten sposób:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member "serviceAccount:service-$(gcloud projects describe ${GOOGLE_CLOUD_PROJECT} --format="value(projectNumber)")@serverless-robot-prod.iam.gserviceaccount.com" \ --role "roles/compute.networkUser"
- Aby wdrożyć aplikację do 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
Y
iEnter
, aby potwierdzić, że chcesz kontynuować:Do you want to continue (Y/n)? Y
Po kilku minutach aplikacja powinna wyświetlić adres URL, który należy otworzyć.
Otwórz adres URL, aby zobaczyć aplikację w akcji. Za każdym razem, gdy otworzysz adres URL lub odświeżysz stronę, zobaczysz 5 najnowszych wizyt zwróconych w formacie JSON.
Po kilku minutach aplikacja powinna wyświetlić adres URL, który należy otworzyć.
Otwórz adres URL, aby zobaczyć aplikację w akcji. Za każdym razem, gdy odwiedzasz adres URL lub odświeżasz stronę, zobaczysz 5 najnowszych wizyt zwróconych w formacie JSON.
10. Gratulacje
W tym module nauczysz się:
- Utwórz instancję AlloyDB (skonfigurowaną do korzystania z usługi Private Service Connect).
- Wdrażanie w Cloud Run aplikacji, która łączy się z Twoją instancją AlloyDB
- Dodawanie funkcji do aplikacji za pomocą Gemini Code Assist
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 użyć:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}