1. Einführung
Übersicht
In diesem Lab erstellen und stellen Sie eine Website bereit, deren Inhalte von den Large Language Models (LLMs) von Google Gemini dynamisch generiert werden. Die Website ist ein einfacher Navigator im Stil von „Wähle dein eigenes Abenteuer“, mit dem Sie Themen erkunden können. Bei jedem Klick wird eine neue Seite mit neuen Links basierend auf Ihrer Auswahl generiert. Sie erstellen die Website mit Node.js und Fastify, verwenden das Vertex AI SDK, um Gemini aufzurufen, stellen sie als sicheren, produktionsbereiten Dienst in Cloud Run bereit und sichern sie mit Identity-Aware Proxy (IAP).
Aufgaben
- Node.js-Fastify-Anwendung erstellen, die Vertex AI verwendet
- Anwendung aus der Quelle in Cloud Run bereitstellen, ohne Dockerfile
- Cloud Run-Endpunkt mit Identity-Aware Proxy (IAP) sichern
Lerninhalte
- Vertex AI SDK für Node.js zum Generieren von Inhalten verwenden
- Node.js-Anwendung in Cloud Run bereitstellen
- Cloud Run-Anwendung mit IAP sichern
2. Projekt einrichten
- Wenn Sie noch kein Google-Konto haben, müssen Sie ein Google-Konto erstellen.
- Verwenden Sie ein privates Konto anstelle eines Arbeits- oder Schulkontos. Bei Arbeits- und Schulkonten können Einschränkungen gelten, die verhindern, dass Sie die für dieses Lab erforderlichen APIs aktivieren.
- Melden Sie sich in der Google Cloud Console an.
- Abrechnung aktivieren in der Cloud Console.
- Die Kosten für dieses Lab sollten weniger als 1 $für Cloud-Ressourcen betragen.
- Am Ende dieses Labs finden Sie eine Anleitung zum Löschen von Ressourcen, um weitere Kosten zu vermeiden.
- Neue Nutzer können die kostenlose Testversion im Wert von 300$ nutzen.
- Erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt wieder.
- Wenn ein Fehler wegen des Projektkontingents angezeigt wird, verwenden Sie ein vorhandenes Projekt wieder oder löschen Sie ein vorhandenes Projekt, um ein neues zu erstellen.
3. Cloud Shell-Editor öffnen
- Klicken Sie auf diesen Link, um direkt zu Cloud Shell-Editor zu gelangen.
- Wenn Sie aufgefordert werden, sich zu authentifizieren, klicken Sie auf Autorisieren , um fortzufahren.

- Wenn das Terminal nicht unten auf dem Bildschirm angezeigt wird, öffnen Sie es:
- Klicken Sie auf Anzeigen.
- Klicken Sie auf Terminal

- Legen Sie im Terminal mit diesem Befehl Ihr Projekt fest:
- Format:
gcloud config set project [PROJECT_ID] - Beispiel:
gcloud config set project lab-project-id-example - Wenn Sie sich nicht an Ihre Projekt-ID erinnern können:
- Sie können alle Ihre Projekt-IDs mit diesem Befehl auflisten:
gcloud projects list | awk '/PROJECT_ID/{print $2}'

- Sie können alle Ihre Projekt-IDs mit diesem Befehl auflisten:
- Format:
- Es sollte folgende Meldung angezeigt werden:
Wenn eineUpdated property [core/project].
WARNINGangezeigt wird und Sie gefragt werdenDo you want to continue (Y/n)?, haben Sie wahrscheinlich die Projekt-ID falsch eingegeben. Drücken Sien, drücken SieEnter, und versuchen Sie noch einmal, den Befehlgcloud config set projectauszuführen.
- Legen Sie die Umgebungsvariable
GOOGLE_CLOUD_PROJECTfest.export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
4. APIs aktivieren
Aktivieren Sie im Terminal die APIs:
gcloud services enable \
run.googleapis.com \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com \
iap.googleapis.com
Wenn Sie aufgefordert werden, sich zu authentifizieren, klicken Sie auf Autorisieren , um fortzufahren. 
Die Ausführung dieses Befehls kann einige Minuten dauern. Am Ende sollte jedoch eine Erfolgsmeldung wie diese angezeigt werden:
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
5. Node.js-Projekt vorbereiten
- Erstellen Sie einen Ordner mit dem Namen
gen-ui-on-cloudrun, um den Quellcode für die Bereitstellung zu speichern:mkdir gen-ui-on-cloudrun && cd gen-ui-on-cloudrun - Initialisieren Sie ein Node.js-Projekt:
npm init -y - Konfigurieren Sie das Projekt so, dass ES-Module verwendet werden, und definieren Sie ein Startskript, indem Sie diese Befehle ausführen:
npm pkg set type="module" - Installieren Sie
fastifyfür den Webserver und@google/genaifür das Vertex AI SDK:npm install fastify @google/genai
6. Anwendungscode erstellen
- Erstellen und öffnen Sie eine neue
index.ts-Datei für den Quellcode der Anwendung: Mit dem Befehlcloudshell edit ~/gen-ui-on-cloudrun/index.tscloudshell editwird die Dateiindex.tsim Editor über dem Terminal geöffnet. - Fügen Sie in der Datei
index.tsden folgenden Quellcode für den generativen UI-Server hinzu:import fastifyLib from 'fastify'; import { GoogleGenAI } from '@google/genai'; const fastify = fastifyLib({ logger: true }); const ai = new GoogleGenAI({ vertexai: true, project: process.env.GOOGLE_CLOUD_PROJECT, location: process.env.GOOGLE_CLOUD_LOCATION || 'europe-west4', }); const SYSTEM_INSTRUCTION = `The user should have submitted an html page and the id of the element just clicked. Given the next page description, create a new webpage with a link back to "Start Over" (the / route), a brief overview of the topic, and a list of clickable link elements related to the page. When an element is clicked, the webpage should link to the base route / with the nextPageDescription as a query string parameter. All information needed to generate the next page should be included in the nextPageDescription without additional context. Each nextPageDescription should be less than 1500 characters. Example: If the current HTML page is for a small pet store, it might include a link to an "About" page. The href for the about page link should be /?nextPageDescription=about%20page%20for%20small%20pet%20store%20website All responses should be valid HTML without markdown backticks.`; interface QueryParams { nextPageDescription?: string; } fastify.get<{ Querystring: QueryParams }>('/', async (request, reply) => { const { nextPageDescription = 'A web page with interesting fun facts where I can select a fact to learn more about that topic.' } = request.query; try { const response = await ai.models.generateContent({ model: 'gemini-2.5-flash', contents: nextPageDescription, config: { systemInstruction: SYSTEM_INSTRUCTION, temperature: 0.9, } }); reply.type('text/html; charset=utf-8').send(response.text); } catch (error: any) { request.log.error(error); reply.status(500).send('An error occurred calling the AI.'); } }); const start = async () => { try { await fastify.listen({ port: Number(process.env.PORT) || 8080, host: '0.0.0.0' }); } catch (err) { fastify.log.error(err); process.exit(1); } }; start();
Dieser Code richtet einen Webserver ein, der auf HTTP-GET-Anfragen im Stammverzeichnis (/) wartet. Wenn eine Anfrage eingeht, wird der Abfrageparameter nextPageDescription (oder ein Standardwert) als Prompt für das Gemini 2.5 Flash-Modell über Vertex AI verwendet. Das Modell wird von SYSTEM_INSTRUCTION angewiesen, eine HTML-Seite mit Links zurückzugeben. Jeder Link enthält eine nextPageDescription zum Generieren der nachfolgenden Seite.
7. Dienstkonto erstellen
Sie benötigen ein Dienstkonto für Ihren Cloud Run-Dienst, um sich bei der Vertex AI API zu authentifizieren.
- Erstellen Sie ein Dienstkonto mit dem Namen
gen-navigator-sa:gcloud iam service-accounts create gen-navigator-sa --display-name="Generative Navigator Service Account" - Gewähren Sie dem Dienstkonto die Berechtigung zur Verwendung von Vertex AI:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member="serviceAccount:gen-navigator-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \ --role="roles/aiplatform.user"
8. In Cloud Run bereitstellen
Stellen Sie die Anwendung jetzt direkt aus dem Quellcode in Cloud Run bereit, ohne dass ein Dockerfile erforderlich ist.
- Führen Sie den Befehl
gcloudaus, um die Anwendung bereitzustellen: Hier verwenden wir einige wichtige Flags:cd ~/gen-ui-on-cloudrun gcloud beta run deploy generative-web-navigator \ --source . \ --no-build \ --base-image=nodejs24 \ --command="node" \ --args="index.ts" \ --region=europe-west4 \ --no-allow-unauthenticated \ --iap \ --service-account="gen-navigator-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \ --set-env-vars GOOGLE_CLOUD_PROJECT="$GOOGLE_CLOUD_PROJECT",GOOGLE_CLOUD_LOCATION="europe-west4"--source . --no-build --base-image=nodejs24: Damit wird Cloud Run angewiesen, den Quellcode aus dem aktuellen Verzeichnis bereitzustellen, die Build-Phase zu überspringen und die Anwendung mit einem vordefinierten Node.js 24-Basis-Image auszuführen.--no-allow-unauthenticated: Dadurch wird sichergestellt, dass nur authentifizierte Nutzer auf den Dienst zugreifen können.--iap: Dadurch wird Identity-Aware Proxy (IAP) aktiviert, um den Zugriff auf Ihre Anwendung zu verwalten. Mit IAP können Sie den Zugriff basierend auf der Nutzeridentität und dem Kontext steuern, nicht nur anhand von IP-Adressen.
- Nach einigen Minuten wird eine Meldung wie diese angezeigt:
Service [generative-web-navigator] revision [generative-web-navigator-12345-abc] has been deployed and is serving 100 percent of traffic.
Sie haben Ihre Anwendung bereitgestellt, müssen aber noch IAP konfigurieren, um den Zugriff zu ermöglichen.
9. IAP-Zugriff konfigurieren
Wenn Sie IAP in Cloud Run aktivieren, fängt IAP alle Anfragen ab und erfordert, dass sich Nutzer authentifizieren und autorisiert werden, bevor sie Ihren Dienst erreichen können. Dazu müssen Sie zwei Berechtigungen gewähren:
- Erlauben Sie dem IAP-Dienst selbst, Ihren Cloud Run-Dienst aufzurufen.
- Erlauben Sie sich selbst (oder anderen Nutzern/Gruppen), über IAP auf die Anwendung zuzugreifen.
- Rufen Sie Ihre Projektnummer ab, die zur Identifizierung des IAP-Dienst-Agents erforderlich ist:
export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)") - Weisen Sie dem IAP-Dienst-Agent die Rolle
roles/run.invokerfür Ihren Cloud Run-Dienst zu. Dadurch kann IAP Ihren Dienst aufrufen, nachdem ein Nutzer authentifiziert und autorisiert wurde.gcloud run services add-iam-policy-binding generative-web-navigator \ --region=europe-west4 \ --member="serviceAccount:service-$PROJECT_NUMBER@gcp-sa-iap.iam.gserviceaccount.com" \ --role="roles/run.invoker" - Weisen Sie Ihrem Nutzerkonto die Rolle
roles/iap.httpsResourceAccessorzu. Damit können Sie auf IAP-gesicherte HTTPS-Ressourcen zugreifen.gcloud beta iap web add-iam-policy-binding \ --resource-type=cloud-run \ --region=europe-west4 \ --service=generative-web-navigator \ --member="user:$(gcloud config get-value account)" \ --role="roles/iap.httpsResourceAccessor"
10. Anwendung testen
- Rufen Sie die URL Ihres bereitgestellten Dienstes ab:
gcloud run services describe generative-web-navigator --format='value(status.url)' --region=europe-west4 - Kopieren Sie die URL und öffnen Sie sie in Ihrem Webbrowser. Da der Dienst mit IAP gesichert ist, werden Sie aufgefordert, sich mit Ihrem Google-Konto anzumelden, wenn Sie noch nicht angemeldet sind. Nach der Authentifizierung sollte die erste automatisch generierte Seite angezeigt werden.
- Klicken Sie auf einen Link, um zu einer neuen Seite zu gelangen, die von der KI basierend auf dem angeklickten Link generiert wird.
Fertig! Sie haben erfolgreich eine generative UI-Website in Cloud Run bereitgestellt und mit IAP gesichert.
11. Fazit
Glückwunsch! Sie haben mit Cloud Run, Vertex AI und IAP erfolgreich eine generative UI-Website bereitgestellt und gesichert.
(Optional) Bereinigen
Wenn Sie die erstellten Ressourcen bereinigen möchten, können Sie Ihr Cloud-Projekt löschen, um zusätzliche Kosten zu vermeiden.
Während für Cloud Run keine Kosten anfallen, wenn der Dienst nicht verwendet wird, wird Ihnen dennoch das Speichern von Build-Artefakten möglicherweise in Rechnung gestellt, falls welche erstellt wurden. Durch das Löschen des Cloudprojekts wird die Abrechnung für alle in diesem Projekt verwendeten Ressourcen beendet.
Wenn Sie möchten, löschen Sie das Projekt:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
Möglicherweise möchten Sie auch unnötige Ressourcen von Ihrem Cloud Shell-Laufwerk löschen. Sie haben folgende Möglichkeiten:
- Löschen Sie das Codelab-Projektverzeichnis:
rm -rf ~/gen-ui-on-cloudrun - Warnung! Diese Aktion kann nicht rückgängig gemacht werden. Wenn Sie alle Daten in Ihrer Cloud Shell löschen möchten, um Speicherplatz freizugeben, können Sie Ihr gesamtes Basisverzeichnis löschen. Achten Sie darauf, dass alle Daten, die Sie behalten möchten, an einem anderen Ort gespeichert sind.
sudo rm -rf $HOME