Generative AI-Go-Webanwendung automatisch aus der Versionskontrolle in Cloud Run bereitstellen

1. Übersicht

Die erstmalige Bereitstellung einer Webanwendung kann schwierig sein. Auch nach der ersten Bereitstellung kann es sein, dass Sie die Bereitstellung neuer Versionen Ihrer Anwendung vermeiden, wenn der Prozess zu aufwendig ist. Mit Continuous Deployment können Sie Änderungen an Ihrer Anwendung ganz einfach automatisch bereitstellen.

In diesem Lab schreiben Sie eine Webanwendung und konfigurieren Cloud Run so, dass Ihre Anwendung automatisch bereitgestellt wird, wenn eine Änderung am Quellcode Ihrer Anwendung vorgenommen wird. Anschließend ändern Sie Ihre Anwendung und stellen sie noch einmal bereit.

Lerninhalte

  • Webanwendung mit dem Cloud Shell-Editor schreiben
  • Anwendungscode in GitHub speichern
  • Anwendung automatisch in Cloud Run bereitstellen
  • Generative KI mit Vertex AI in Ihre Anwendung einbinden

2. Vorbereitung

  1. Wenn Sie noch kein Google-Konto haben, müssen Sie ein Google-Konto erstellen.
    • Verwenden Sie stattdessen ein privates Konto. Bei Arbeitskonten und Konten von Bildungseinrichtungen kann es Einschränkungen geben, die verhindern, dass Sie die für dieses Lab erforderlichen APIs aktivieren.
  2. Wenn Sie noch kein GitHub-Konto haben, müssen Sie ein GitHub-Konto erstellen.

3. Projekt einrichten

  1. Melden Sie sich in der Google Cloud Console an.
  2. Aktivieren Sie die Abrechnung in der Cloud Console.
    • Die Kosten für Cloud-Ressourcen für dieses Lab sollten weniger als 1 $betragen.
    • Sie können die Schritte am Ende dieses Labs ausführen, um Ressourcen zu löschen und so weitere Kosten zu vermeiden.
    • Neuen Nutzern steht die kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung.
    • Sie nehmen an einem Gen AI for Devs-Event teil? Möglicherweise ist eine Gutschrift in Höhe von 1$ verfügbar.
  3. Erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt wieder.
  4. Prüfen Sie in der Cloud-Abrechnung unter Meine Projekte 
      , ob die Abrechnung aktiviert ist.
    • Wenn in der Spalte Billing account Ihres neuen Projekts Billing is disabled steht:
      1. Klicken Sie in der Spalte Actions auf die drei Punkte.
      2. Klicken Sie auf Abrechnung ändern.
      3. Wählen Sie das gewünschte Rechnungskonto aus.
    • Wenn Sie an einer Veranstaltung zum Thema „Generative KI für Entwickler“ teilnehmen, heißt das Konto wahrscheinlich Google Cloud Platform-Testrechnungskonto.

4. Cloud Shell-Editor öffnen

  1. Cloud Shell-Editor aufrufen
  2. Wenn das Terminal nicht unten auf dem Bildschirm angezeigt wird, öffnen Sie es:
    • Klicken Sie auf das Dreistrich-Menü Symbol für das Dreistrich-Menü.
    • Klicken Sie auf Terminal.
    • Klicken Sie auf Neues TerminalNeues Terminal im Cloud Shell-Editor öffnen.
  3. Legen Sie im Terminal Ihr Projekt mit diesem Befehl 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 folgendem Befehl auflisten:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Projekt-ID im Cloud Shell Editor-Terminal festlegen
  4. Wenn Sie zur Autorisierung aufgefordert werden, klicken Sie auf Autorisieren, um fortzufahren. Klicken Sie, um Cloud Shell zu autorisieren.
  5. Es sollte folgende Meldung angezeigt werden:
    Updated property [core/project].
    
    Wenn Sie WARNING sehen und Do you want to continue (Y/N)? gefragt werden, haben Sie die Projekt-ID wahrscheinlich falsch eingegeben. Drücken Sie N, dann Enter und versuchen Sie, den Befehl gcloud config set project noch einmal auszuführen.

5. APIs aktivieren

Aktivieren Sie die APIs im Terminal:

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  aiplatform.googleapis.com

Es kann einige Minuten dauern, bis dieser Befehl ausgeführt wird. Wenn die Ausführung erfolgreich war, erhalten Sie eine Meldung, die ungefähr so aussieht:

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

6. Git konfigurieren

  1. Legen Sie Ihre globale Git-Nutzer-E-Mail-Adresse fest:
    git config --global user.email "you@example.com"
    
  2. Legen Sie Ihren globalen Git-Nutzernamen fest:
    git config --global user.name "Your Name"
    
  3. Legen Sie den globalen Git-Standardzweig auf main fest:
    git config --global init.defaultBranch main
    

7. Code schreiben

So schreiben Sie eine Anwendung in Go:

  1. Rufen Sie das Basisverzeichnis auf:
    cd ~
    
  2. Erstellen Sie das Verzeichnis codelab-genai:
    mkdir codelab-genai
    
  3. Rufen Sie das Verzeichnis codelab-genai auf:
    cd codelab-genai
    
  4. Initialisieren Sie eine go.mod-Datei, um unser Modul zu deklarieren:
    go mod init codelab-genai
    
  5. main.go-Datei erstellen:
    touch main.go
    
  6. Öffnen Sie die Datei main.go im Cloud Shell-Editor:
    cloudshell edit main.go
    
    Oben auf dem Bildschirm sollte jetzt eine leere Datei angezeigt werden. Hier können Sie die Datei main.go bearbeiten. Zeigen Sie, dass der Code im oberen Bereich des Bildschirms eingegeben wird.
  7. Bearbeiten Sie main.go und fügen Sie den folgenden Code ein:
    package main
    
    import (
        "fmt"
        "log"
        "net/http"
        "os"
    )
    
    func main() {
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
            fmt.Fprintln(w, "Hello, world!")
        })
    
        port := os.Getenv("PORT")
    
        if port == "" {
            port = "8080"
        }
        if err := http.ListenAndServe(":"+port, nil); err != nil {
            log.Fatal(err)
        }
    }
    
    Nach einigen Sekunden wird Ihr Code automatisch im Cloud Shell-Editor gespeichert. Dieser Code antwortet auf HTTP-Anfragen mit der Begrüßung „Hello World!“.

Der erste Code für Ihre Anwendung ist fertig und kann in der Versionsverwaltung gespeichert werden.

8. Repository erstellen

  1. Kehren Sie zum Cloud Shell-Terminal unten auf dem Bildschirm zurück.
  2. Prüfen Sie, ob Sie sich noch im richtigen Verzeichnis befinden:
    cd ~/codelab-genai
    
  3. Git-Repository initialisieren
    git init -b main
    
  4. Bei der GitHub CLI anmelden
    gh auth login
    
    Drücken Sie Enter, um die Standardoptionen zu übernehmen, und folgen Sie der Anleitung im GitHub-CLI-Tool, einschließlich:
    1. In welchem Konto möchten Sie sich anmelden? GitHub.com
    2. Welches Protokoll bevorzugen Sie für Git-Vorgänge auf diesem Host? HTTPS
    3. Git mit Ihren GitHub-Anmeldedaten authentifizieren? Y (Überspringen Sie diesen Schritt, wenn diese Option nicht angezeigt wird.)
    4. Wie möchten Sie die GitHub CLI authentifizieren? Login with a web browser
    5. Einmalcode kopieren
    6. Öffnen Sie https://github.com/login/device.
    7. Einmal verwendbaren Code einfügen
    8. Klicken Sie auf GitHub autorisieren.
    9. Anmeldung abschließen
  5. Prüfen Sie, ob Sie angemeldet sind:
    gh api user -q ".login"
    
    Wenn Sie sich erfolgreich angemeldet haben, sollte Ihr GitHub-Nutzername ausgegeben werden.
  6. GITHUB_USERNAME-Variable erstellen
    GITHUB_USERNAME=$(gh api user -q ".login")
    
  7. Prüfen Sie, ob Sie die Umgebungsvariable erstellt haben:
    echo ${GITHUB_USERNAME}
    
    Wenn Sie die Variable erfolgreich erstellt haben, sollte Ihr GitHub-Nutzername ausgegeben werden.
  8. Erstellen Sie ein leeres GitHub-Repository mit dem Namen codelab-genai:
    gh repo create codelab-genai --private
    
    Wenn Sie den Fehler erhalten:
    GraphQL: Name already exists on this account (createRepository)
    
    Dann haben Sie bereits ein Repository mit dem Namen codelab-genai. Sie haben zwei Möglichkeiten, dieser Anleitung zu folgen:
  9. Fügen Sie das Repository codelab-genai als Remote-Repository origin hinzu:
    git remote add origin https://github.com/${GITHUB_USERNAME}/codelab-genai
    

9. Code teilen

  1. Prüfen Sie, ob Sie sich im richtigen Verzeichnis befinden:
    cd ~/codelab-genai
    
  2. Fügen Sie diesem Commit alle Dateien im aktuellen Verzeichnis hinzu:
    git add .
    
  3. Ersten Commit erstellen:
    git commit -m "add http server"
    
  4. Übertragen Sie Ihr Commit per Push an den main-Branch des origin-Repositorys:
    git push -u origin main
    

Sie können diesen Befehl ausführen und die resultierende URL aufrufen, um den Anwendungscode auf GitHub aufzurufen:

echo -e "\n\nTo see your code, visit this URL:\n \
    https://github.com/${GITHUB_USERNAME}/codelab-genai/blob/main/main.go \n\n"

10. Automatische Deployments einrichten

  1. Lassen Sie den Tab des Cloud Shell-Editors geöffnet. Wir werden später zu diesem Tab zurückkehren.
  2. Rufen Sie in einem neuen Tab die Cloud Run-Seite auf.
  3. Wählen Sie in der Console das richtige Google Cloud-Projekt aus Google Cloud Console-Projekt-Dropdown-Menü
  4. Klicken Sie auf REPO VERBINDEN.
  5. Klicken Sie auf MIT CLOUD BUILD EINRICHTEN.
    1. Wählen Sie GitHub als Repository-Anbieter aus.
      • Wenn Sie nicht in Ihrem GitHub-Konto im Browser angemeldet sind, melden Sie sich mit Ihren Anmeldedaten an.
    2. Klicken Sie auf Authentifizieren und dann auf Weiter.
    3. Nach der Anmeldung wird auf der Cloud Run-Seite die Meldung Die GitHub-App ist in keinem Ihrer Repositories installiert. angezeigt.
    4. Klicken Sie auf die Schaltfläche GOOGLE CLOUD BUILD INSTALLIEREN.
      • Wählen Sie auf der Seite „Installation Setup“ (Installation einrichten) die Option Only select repositories (Nur Repositories auswählen) aus und wählen Sie das Repository codelab-genai aus, das Sie über die CLI erstellt haben.
      • Klicken Sie auf Installieren.
      • Hinweis: Wenn Sie viele GitHub-Repositories haben, kann es einige Minuten dauern, bis die Seite geladen ist.
    5. Wählen Sie your-user-name/codelab-genai als Repository aus.
      • Wenn das Repository nicht vorhanden ist, klicken Sie auf den Link Verbundene Repositories verwalten.
    6. Behalten Sie für Branch den Wert ^main$ bei.
    7. Klicken Sie auf Go, Node.js, Python, Java, .NET Core, Ruby oder PHP über Buildpacks von Google Cloud
        .
      • Lassen Sie die anderen Felder (Build context directory, Entrypoint und Function target) unverändert.
    8. Klicken Sie auf Speichern.
  6. Scrollen Sie nach unten zu Authentifizierung.
  7. Klicken Sie auf Nicht authentifizierte Aufrufe zulassen.
  8. Klicke auf ERSTELLEN.

Wenn der Build abgeschlossen ist (was einige Minuten dauert), führen Sie diesen Befehl aus und rufen Sie die resultierende URL auf, um Ihre laufende Anwendung aufzurufen:

echo -e "\n\nOnce the build finishes, visit your live application:\n \
    "$( \
        gcloud run services list | \
        grep codelab-genai | \
        awk '/URL/{print $2}' | \
        head -1 \
    )" \n\n"

11. Code ändern

  1. Kehren Sie zum Cloud Shell-Terminal unten auf dem Bildschirm zurück.
  2. Prüfen Sie, ob Sie sich noch im richtigen Verzeichnis befinden:
    cd ~/codelab-genai
    
  3. main.go im Cloud Shell-Editor wieder öffnen
    cloudshell edit main.go
    
  4. Installieren Sie das Vertex AI SDK for Go:
    go get cloud.google.com/go/vertexai/genai
    
  5. Installieren Sie die Metadatenbibliothek für Go, um die aktuelle Projekt-ID abzurufen:
    go get cloud.google.com/go/compute/metadata
    
  6. Ersetzen Sie den Code in Ihrer main.go-Datei durch Folgendes:
    package main
    
    import (
        "context"
        "fmt"
        "log"
        "net/http"
        "os"
    
        "cloud.google.com/go/compute/metadata"
        "cloud.google.com/go/vertexai/genai"
    )
    
    func main() {
        ctx := context.Background()
        var projectId string
        var err error
        projectId = os.Getenv("GOOGLE_CLOUD_PROJECT")
        if projectId == "" {
            projectId, err = metadata.ProjectIDWithContext(ctx)
            if err != nil {
                return
            }
        }
        var client *genai.Client
        client, err = genai.NewClient(ctx, projectId, "us-central1")
        if err != nil {
            return
        }
        defer client.Close()
    
        model := client.GenerativeModel("gemini-1.5-flash-001")
    
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
            animal := r.URL.Query().Get("animal")
            if animal == "" {
                animal = "dog"
            }
    
            resp, err := model.GenerateContent(
                ctx,
                genai.Text(
                    fmt.Sprintf("Give me 10 fun facts about %s. Return the results as HTML without markdown backticks.", animal)),
            )
    
            if err != nil {
                w.WriteHeader(http.StatusServiceUnavailable)
                return
            }
    
            if len(resp.Candidates) > 0 && len(resp.Candidates[0].Content.Parts) > 0 {
                htmlContent := resp.Candidates[0].Content.Parts[0]
                w.Header().Set("Content-Type", "text/html; charset=utf-8")
                fmt.Fprint(w, htmlContent)
            }
        })
    
        port := os.Getenv("PORT")
    
        if port == "" {
            port = "8080"
        }
        if err := http.ListenAndServe(":"+port, nil); err != nil {
            log.Fatal(err)
        }
    }
    

12. Noch einmal bereitstellen

  1. Prüfen Sie, ob Sie sich in Cloud Shell noch im richtigen Verzeichnis befinden:
    cd ~/codelab-genai
    
  2. Führen Sie diese Befehle aus, um eine neue Version Ihrer Anwendung in Ihrem lokalen Git-Repository zu committen:
    git add .
    git commit -m "add latest changes"
    
  3. Übertragen Sie die Änderungen per Push an GitHub:
    git push
    
  4. Führen Sie nach Abschluss des Builds diesen Befehl aus und rufen Sie Ihre bereitgestellte Anwendung auf:
    echo -e "\n\nOnce the build finishes, visit your live application:\n \
        "$( \
            gcloud run services list | \
            grep codelab-genai | \
            awk '/URL/{print $2}' | \
            head -1 \
        )" \n\n"
    

Es kann einige Minuten dauern, bis der Build abgeschlossen ist und Sie Ihre Änderungen sehen können.

Den Verlauf aller Überarbeitungen finden Sie unter https://console.cloud.google.com/run/detail/us-central1/codelab-genai/revisions.

13. (Optional) Vertex AI-Nutzung prüfen

Wie bei anderen Google Cloud-Diensten können Sie Vertex AI-Vorgänge prüfen. Anhand von Audit-Logs können Sie herausfinden, wer was wo und wann getan hat. Administrative Audit-Logs für Vertex AI sind standardmäßig aktiviert. Wenn Sie Anfragen zum Generieren von Inhalten prüfen möchten, müssen Sie Audit-Logs zum Datenzugriff aktivieren:

  1. Rufen Sie in der Google Cloud Console die Seite Audit-Logs auf:

    Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift IAM & Verwaltung lautet.
  2. Achten Sie darauf, dass Sie die Cloud Run-Anwendung in dem vorhandenen Google Cloud-Projekt erstellen.
  3. Suchen Sie in der Tabelle Konfiguration für Audit-Logs zum Datenzugriff in der Spalte „Dienst“ nach Vertex AI API.
  4. Wählen Sie auf dem Tab Logtypen die Audit-Logtypen für den Datenzugriff Admin read und Data read aus.
  5. Klicken Sie auf Speichern.

Nach der Aktivierung können Sie Audit-Logs für jeden Aufruf der Anwendung einsehen. So rufen Sie die Audit-Logs mit Aufrufdetails auf:

  1. Kehren Sie zu Ihrer bereitgestellten Anwendung zurück und aktualisieren Sie die Seite, um das Log auszulösen.
  2. Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf:

  3. Geben Sie im Abfragefenster Folgendes ein:
    LOG_ID("cloudaudit.googleapis.com%2Fdata_access")
    protoPayload.serviceName="aiplatform.googleapis.com"
    
  4. Klicken Sie auf Abfrage ausführen.

In den Audit-Logs wird die Verwendung der Vertex AI API erfasst, aber Sie können keine arbeitslastbezogenen Daten wie Prompts oder Antwortdetails sehen.

14. (Optional) Beobachtbarkeit Ihrer KI-Arbeitslast erhöhen

In Audit-Logs werden keine Informationen zu Arbeitslasten erfasst. Damit Sie Ihre Arbeitslasten besser beobachten können, müssen Sie diese Informationen explizit protokollieren. Dazu können Sie Ihr bevorzugtes Logging-Framework verwenden. Die folgenden Schritte zeigen eine Möglichkeit, dies mit der strukturierten Logging-Bibliothek von Go zu tun.

  1. main.go im Cloud Shell-Editor wieder öffnen
    cloudshell edit ~/codelab-genai/main.go
    
  2. Ändern Sie den Importblock so, dass er die strukturierten Logging- und JSON-Bibliotheken von Go enthält:
    import (
        "context"
        "encoding/json"
        "fmt"
        "log"
        "log/slog"
        "net/http"
        "os"
    
        "cloud.google.com/go/compute/metadata"
        "cloud.google.com/go/vertexai/genai"
    )
    
  3. Fügen Sie nach der Initialisierung des Vertex-Clients (Zeile 33) die folgenden Zeilen hinzu, um einen strukturierten Logger zu initialisieren, der die richtigen Felder für Google Cloud Logging verwendet:
    opts := &slog.HandlerOptions{
    	Level: slog.LevelDebug,
    	ReplaceAttr: func(group []string, a slog.Attr) slog.Attr {
            if a.Key == slog.LevelKey {
                return slog.Attr{Key: "severity", Value: a.Value}
            }
            if a.Key == slog.MessageKey {
                return slog.Attr{Key: "message", Value: a.Value}
            }
            return slog.Attr{Key: a.Key, Value: a.Value}
    	},
    }
    
    jsonHandler := slog.NewJSONHandler(os.Stdout, opts)
    slog.SetDefault(slog.New(jsonHandler))
    
  4. Fügen Sie nach der Überprüfung auf eine Antwort auf GenerateContent (Zeile 69) die folgenden Zeilen in den if-Block ein:
    jsonBytes, err := json.Marshal(resp)
    if err != nil {
        slog.Error("Failed to marshal response to JSON", "error", err)
    } else {
        jsonString := string(jsonBytes)
        slog.Debug("Complete response content", "json_response", jsonString)
    }
    
    Mit diesem Code werden Informationen zu generierten Inhalten im strukturierten Logging-Format in stdout geschrieben. Ein Logging-Agent in Cloud Run erfasst die in stdout ausgegebene Ausgabe und schreibt dieses Format in Cloud Logging.
  5. Öffnen Sie Cloud Shell noch einmal und geben Sie den folgenden Befehl ein, um sicherzugehen, dass Sie sich im richtigen Verzeichnis befinden:
    cd ~/codelab-genai
    
  6. Führen Sie zum Übernehmen der Änderungen ein Commit durch:
    git commit -am "Observe generated content"
    
  7. Übertragen Sie die Änderungen per Push an GitHub, um die erneute Bereitstellung der geänderten Version auszulösen:
    git push
    

Nachdem die neue Version bereitgestellt wurde, können Sie die Debugging-Informationen zu Aufrufen von Vertex AI ansehen.

So rufen Sie Ihre Anwendungslogs auf:

  1. Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf:

  2. Geben Sie im Abfragefenster Folgendes ein:
    LOG_ID("run.googleapis.com%2Fstdout")
    severity=DEBUG
    
  3. Klicken Sie auf Abfrage ausführen.

Das Ergebnis der Abfrage enthält Protokolle mit dem Prompt und der Vertex AI-Antwort, einschließlich „Sicherheitsbewertungen“, die zur Überwachung von Sicherheitsmaßnahmen verwendet werden können.

15. Optional: Bereinigen

Während für Cloud Run keine Kosten anfallen, wenn der Dienst nicht verwendet wird, wird Ihnen dennoch das Speichern des Container-Images in Artifact Registry möglicherweise in Rechnung gestellt. Sie können Ihr Cloud-Projekt löschen, um wiederkehrende Gebühren zu vermeiden. Durch das Löschen des Cloud-Projekts wird die Abrechnung für alle in diesem Projekt verwendeten Ressourcen beendet.

Wenn Sie möchten, können Sie das Projekt löschen:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Möglicherweise möchten Sie auch unnötige Ressourcen von Ihrer Cloud Shell-Festplatte löschen. Sie haben folgende Möglichkeiten:

  1. Löschen Sie das Codelab-Projektverzeichnis:
    rm -rf ~/codelab-genai
    
  2. Bereinigen Sie alle Go-Pakete, die Sie möglicherweise nicht mehr benötigen:
    cd ~
    go clean -modcache
    
  3. Warnung! Diese Aktion kann nicht rückgängig gemacht werden. Wenn Sie alles in Cloud Shell löschen möchten, um Speicherplatz freizugeben, können Sie Ihr gesamtes Basisverzeichnis löschen. Achten Sie darauf, dass alles, was Sie behalten möchten, an einem anderen Ort gespeichert ist.
    sudo rm -rf $HOME
    

16. Glückwunsch

In diesem Lab haben Sie eine Webanwendung geschrieben und Cloud Run so konfiguriert, dass Ihre Anwendung automatisch bereitgestellt wird, wenn eine Änderung am Quellcode Ihrer Anwendung vorgenommen wird. Anschließend haben Sie Ihre Anwendung geändert und noch einmal bereitgestellt.

Wenn Ihnen dieses Lab gefallen hat, können Sie es noch einmal in einer anderen Programmiersprache oder einem anderen Framework ausprobieren:

Wenn Sie an einer Studie zur Nutzerfreundlichkeit teilnehmen möchten, um die Produkte zu verbessern, mit denen Sie heute gearbeitet haben, registrieren Sie sich hier.

Hier sind einige Optionen, wie Sie weiterlernen können: