Go-Webanwendung mit generativer KI automatisch aus der Versionsverwaltung in Cloud Run bereitstellen

1. Übersicht

Das erste Mal eine Webanwendung bereitzustellen, kann beängstigend sein. Selbst nach der ersten Bereitstellung kann es sein, dass Sie die Bereitstellung neuer Versionen Ihrer Anwendung vermeiden, wenn der Prozess zu viel Arbeit macht. 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 die 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
  • Mit Vertex AI generative KI zu Ihrer Anwendung hinzufügen

2. Vorbereitung

  1. Wenn Sie noch kein Google-Konto haben, müssen Sie ein Google-Konto erstellen.
    • Sie verwenden ein privates Konto anstelle eines Arbeits- oder Schulkontos. Für geschäftliche und schulische Konten gelten möglicherweise Einschränkungen, die Sie daran hindern, die für dieses Lab erforderlichen APIs zu 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 die Durchführung dieses Labs sollten unter 1 $liegen.
    • Sie können die Schritte am Ende dieses Labs ausführen, um Ressourcen zu löschen und weitere Kosten zu vermeiden.
    • Neue Nutzer können das kostenlose Testabo mit einem Guthaben von 300$ nutzen.
    • Nehmen Sie an einer Veranstaltung zu generativer KI für Entwickler teil? Möglicherweise erhalten Sie ein Guthaben in Höhe von 1$.
  3. Erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes.

4. Cloud Shell-Editor öffnen

  1. Rufen Sie den Cloud Shell-Editor auf.
  2. Wenn das Terminal nicht unten auf dem Bildschirm angezeigt wird, öffnen Sie es:
    • Klicke auf das Dreistrich-Menü Dreistrich-Menüsymbol.
    • Klicken Sie auf Terminal.
    • Klicken Sie auf Neues TerminalNeues Terminal im Cloud Shell-Editor öffnen.
  3. Legen Sie das Projekt im Terminal mit diesem Befehl fest:
    • Format:
      gcloud config set project [PROJECT_ID]
      
    • Beispiel:
      gcloud config set project lab-project-id-example
      
    • Wenn Sie sich Ihre Projekt-ID nicht merken können:
      • So listen Sie alle Ihre Projekt-IDs auf:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Projekt-ID im Cloud Shell-Editor-Terminal festlegen
  4. Wenn Sie dazu 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 wahrscheinlich die Projekt-ID falsch eingegeben. Drücken Sie N, Enter und versuchen Sie noch einmal, den Befehl gcloud config set project auszuführen.

5. APIs aktivieren

Aktivieren Sie im Terminal die APIs:

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

Die Verarbeitung dieses Befehls kann einige Minuten dauern. Sie sollten aber schließlich eine Meldung ähnlich der folgenden erhalten:

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

6. Git konfigurieren

  1. Legen Sie die E-Mail-Adresse des globalen Git-Nutzers 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. Der Code wird oben auf dem Bildschirm angezeigt.
  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 der Code im Cloud Shell-Editor automatisch 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 Versionskontrolle gespeichert werden.

8. Repository erstellen

  1. Kehren Sie unten auf dem Bildschirm zum Cloud Shell-Terminal 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. In der GitHub-Befehlszeile anmelden
    gh auth login
    
    Drücken Sie die Enter, um die Standardoptionen zu akzeptieren, und folgen Sie der Anleitung im GitHub-Befehlszeilentool. Dazu gehören:
    1. In welchem Konto möchtest du dich anmelden? GitHub.com
    2. Welches Protokoll verwenden Sie bevorzugt für Git-Vorgänge auf diesem Host? HTTPS
    3. Möchten Sie Git mit Ihren GitHub-Anmeldedaten authentifizieren? Y (Überspringen, wenn diese Option nicht angezeigt wird.)
    4. Wie möchten Sie die GitHub-Befehlszeile authentifizieren? Login with a web browser
    5. Einmalcode kopieren
    6. Öffnen Sie https://github.com/login/device.
    7. Einmaligen 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 hier 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 hier Ihr GitHub-Nutzername ausgegeben werden.
  8. Erstellen Sie ein leeres GitHub-Repository mit dem Namen codelab-genai:
    gh repo create codelab-genai --private
    
    Wenn folgende Fehlermeldung angezeigt wird:
    GraphQL: Name already exists on this account (createRepository)
    
    Dann haben Sie bereits ein Repository mit dem Namen codelab-genai. Sie haben zwei Möglichkeiten, diese Anleitung fortzusetzen:
  9. Fügen Sie das codelab-genai-Repository 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. Erstellen Sie den ersten Commit:
    git commit -m "add http server"
    
  4. Übertragen Sie den Commit per Push in 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 Bereitstellungen einrichten

  1. Lassen Sie den Tab „Cloud Shell-Editor“ geöffnet. Wir kommen später noch einmal auf diesen Tab zurück.
  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 Drop-down-Menü „Projekt“ in der Google Cloud Console.
  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 im Browser in Ihrem GitHub-Konto 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 „Installationseinrichtung“ die Option Nur ausgewählte Repositories und dann das Repository codelab-genai aus, das Sie über die Befehlszeile erstellt haben.
      • Klicke auf Installieren.
      • Hinweis: Wenn Sie viele GitHub-Repositories haben, kann das Laden einige Minuten dauern.
    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.

Sobald der Build abgeschlossen ist (was einige Minuten dauern kann), führen Sie diesen Befehl aus und rufen Sie die resultierende URL auf, um die 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 unten auf dem Bildschirm zum Cloud Shell-Terminal 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. So 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 noch im richtigen Verzeichnis in Cloud Shell befinden:
    cd ~/codelab-genai
    
  2. Führen Sie die folgenden Befehle aus, um eine neue Version Ihrer Anwendung in Ihr lokales 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 die 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 Versionen finden Sie hier: https://console.cloud.google.com/run/detail/us-central1/codelab-genai/revisions

13. Optional: Nutzung von Vertex AI prüfen

Wie bei anderen Google Cloud-Diensten können Sie auch Vertex AI-Vorgänge prüfen. Anhand von Audit-Logs können Sie herausfinden, wer was wo und wann getan hat. Administrator-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 und Verwaltung ist.
  2. Achten Sie darauf, dass Sie Ihre Cloud Run-Anwendung in dem vorhandenen Google Cloud-Projekt erstellen.
  3. Wählen Sie in der Tabelle Konfiguration für Audit-Logs zum Datenzugriff in der Spalte „Dienst“ die Option Vertex AI API aus.
  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 jede Aufrufe der Anwendung sehen. So rufen Sie die Audit-Logs mit Aufrufdetails auf:

  1. Kehren Sie zur bereitgestellten Anwendung zurück und aktualisieren Sie die Seite, um das Protokoll 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 Audit-Protokollen wird die Verwendung der Vertex AI API erfasst, Sie können jedoch keine arbeitslastbezogenen Daten wie Prompts oder Antwortdetails beobachten.

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

Audit-Logs enthalten keine arbeitslastbezogenen Informationen. Um die Beobachtbarkeit Ihrer Arbeitslasten zu verbessern, müssen Sie diese Informationen explizit protokollieren. Sie können dazu Ihr bevorzugtes Logging-Framework verwenden. In den folgenden Schritten wird eine Möglichkeit mit der strukturierten Logging-Bibliothek von Go veranschaulicht.

  1. main.go im Cloud Shell-Editor wieder öffnen
    cloudshell edit ~/codelab-genai/main.go
    
  2. Fügen Sie Ihrem Importblock die strukturierten Logging- und JSON-Bibliotheken von Go hinzu:
    import (
        "context"
        "encoding/json"
        "fmt"
        "log"
        "log/slog"
        "net/http"
        "os"
    
        "cloud.google.com/go/compute/metadata"
        "cloud.google.com/go/vertexai/genai"
    )
    
  3. Nachdem Sie Ihren Vertex-Client initialisiert haben (Zeile 33), fügen Sie 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. Nachdem du nach einer Antwort auf GenerateContent (Zeile 69) gesucht hast, füge 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 Ausgabe, die auf stdout gedruckt wird, und schreibt sie in diesem Format in Cloud Logging.
  5. Öffnen Sie Cloud Shell noch einmal und geben Sie den folgenden Befehl ein, um sicherzustellen, 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 auf GitHub, um die Neubereitstellung der geänderten Version auszulösen:
    git push
    

Nach der Bereitstellung der neuen Version können Sie die Debug-Informationen zu Aufrufen von Vertex AI beobachten.

So rufen Sie Ihre Anwendungsprotokolle 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 Prompt und Vertex AI-Antwort, einschließlich „Sicherheitsbewertungen“, die zum Überwachen von Sicherheitspraktiken verwendet werden können.

15. (Optional) Bereinigen

Für Cloud Run fallen keine Kosten an, wenn der Dienst nicht verwendet wird. Allerdings können für das Speichern des Container-Images in Artifact Registry Gebühren berechnet werden. Sie können Ihr Cloud-Projekt löschen, um wiederkehrende Gebühren zu vermeiden. Wenn Sie Ihr Cloud-Projekt löschen, wird die Abrechnung für alle in diesem Projekt verwendeten Ressourcen beendet.

Sie können das Projekt löschen:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Sie können auch unnötige Ressourcen von Ihrem CloudShell-Laufwerk 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 ganzes 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 wurde. Anschließend haben Sie Ihre Anwendung geändert und noch einmal bereitgestellt.

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

Wenn Sie an einer UX-Forschungsstudie teilnehmen möchten, um die Produkte, mit denen Sie heute gearbeitet haben, zu verbessern, registrieren Sie sich hier.

Hier sind einige Möglichkeiten, wie Sie Ihr Wissen vertiefen können: