Üretken yapay zeka Go web uygulamasını sürüm kontrolünden Cloud Run'a otomatik olarak dağıtma

1. Genel Bakış

Bir web uygulamasını ilk kez dağıtmak korkutucu olabilir. İlk dağıtımdan sonra bile süreç çok fazla iş gerektiriyorsa uygulamanızın yeni sürümlerini dağıtmaktan kaçınabilirsiniz. Sürekli dağıtım sayesinde, uygulamanızdaki değişiklikleri kolayca otomatik olarak dağıtabilirsiniz.

Bu laboratuvarda bir web uygulaması yazacak ve uygulamanızın kaynak kodunda değişiklik yapıldığında uygulamanızı otomatik olarak dağıtmak için Cloud Run'ı yapılandıracaksınız. Ardından, uygulamanızı değiştirip tekrar dağıtırsınız.

Öğrenecekleriniz

  • Cloud Shell Düzenleyici ile web uygulaması yazma
  • Uygulama kodunuzu GitHub'da saklama
  • Uygulamanızı Cloud Run'a otomatik olarak dağıtma
  • Vertex AI'ı kullanarak uygulamanıza üretken yapay zeka ekleme

2. Ön koşullar

  1. Google Hesabınız yoksa Google Hesabı oluşturmanız gerekir.
    • İş veya okul hesabı yerine kişisel hesap kullanıyorsanız. İş ve okul hesaplarında, bu laboratuvar için gereken API'leri etkinleştirmenizi engelleyen kısıtlamalar olabilir.
  2. Henüz bir GitHub hesabınız yoksa GitHub hesabı oluşturmanız gerekir

3. Proje ayarlama

  1. Google Cloud Console'da oturum açın.
  2. Cloud Console'da faturalandırmayı etkinleştirin.
    • Bu laboratuvarı tamamlamak için 1 ABD dolarından daha az tutarda bulut kaynağı kullanmanız gerekir.
    • Daha fazla ödeme alınmaması için bu laboratuvarın sonundaki adımları uygulayarak kaynakları silebilirsiniz.
    • Yeni kullanıcılar 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.
    • Gen AI for Devs etkinliğine mi katılıyorsunuz? 1 ABD doları tutarında kredi alabilirsiniz.
  3. Yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanmayı seçin.
  4. Cloud Faturalandırma'daki Projelerim bölümünde faturalandırmanın etkinleştirildiğini onaylayın.
    • Yeni projenizin Billing account sütununda Billing is disabled yazıyorsa:
      1. Actions sütunundaki üç noktayı tıklayın.
      2. Faturalandırmayı değiştir'i tıklayın.
      3. Kullanmak istediğiniz faturalandırma hesabını seçin.
    • Gen AI for Devs etkinliğine katılıyorsanız hesabın adı büyük olasılıkla Google Cloud Platform Deneme Sürümü Faturalandırma Hesabı olur.

4. Cloud Shell Düzenleyici'yi açma

  1. Cloud Shell Düzenleyici'ye gidin.
  2. Terminal ekranın alt kısmında görünmüyorsa açın:
    • Hamburger menüsünü Hamburger menü simgesi tıklayın.
    • Terminal'i tıklayın.
    • Yeni Terminal'i tıklayın.Cloud Shell Düzenleyici'de yeni terminal açma
  3. Terminalde şu komutla projenizi ayarlayın:
    • Biçim:
      gcloud config set project [PROJECT_ID]
      
    • Örnek:
      gcloud config set project lab-project-id-example
      
    • Proje kimliğinizi hatırlamıyorsanız:
      • Tüm proje kimliklerinizi şu komutla listeleyebilirsiniz:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Cloud Shell Düzenleyici terminalinde proje kimliğini ayarlama
  4. Yetkilendirmeniz istenirse devam etmek için Yetkilendir'i tıklayın. Cloud Shell'e yetki vermek için tıklayın.
  5. Şu mesajı görmeniz gerekir:
    Updated property [core/project].
    
    WARNING simgesini görüyorsanız ve Do you want to continue (Y/N)? soruluyorsa proje kimliğini yanlış girmiş olabilirsiniz. N tuşuna, Enter tuşuna basın ve gcloud config set project komutunu tekrar çalıştırmayı deneyin.

5. API'leri etkinleştir

Terminalde API'leri etkinleştirin:

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

Bu komutun tamamlanması birkaç dakika sürebilir ancak sonunda aşağıdakine benzer bir başarılı mesaj üretmesi gerekir:

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

6. Git'i yapılandırma

  1. Genel Git kullanıcı e-posta adresinizi ayarlayın:
    git config --global user.email "you@example.com"
    
  2. Genel Git kullanıcı adınızı ayarlayın:
    git config --global user.name "Your Name"
    
  3. Global git varsayılan dalınızı main olarak ayarlayın:
    git config --global init.defaultBranch main
    

7. Kodunuzu yazın

Go ile uygulama yazmak için:

  1. Ana dizine gidin:
    cd ~
    
  2. codelab-genai dizinini oluşturun:
    mkdir codelab-genai
    
  3. codelab-genai dizinine gidin:
    cd codelab-genai
    
  4. Modülümüzü bildirmek için bir go.mod dosyası başlatın:
    go mod init codelab-genai
    
  5. main.go dosyası oluşturma:
    touch main.go
    
  6. main.go dosyasını Cloud Shell Düzenleyici'de açın:
    cloudshell edit main.go
    
    Ekranın üst kısmında artık boş bir dosya görünmelidir. Bu main.go dosyasını buradan düzenleyebilirsiniz. Kodun ekranın üst kısmına yerleştirilmesi gerektiğini gösterin.
  7. main.go dosyasını düzenleyin ve aşağıdaki kodu dosyaya yapıştırın:
    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)
        }
    }
    
    Cloud Shell Düzenleyici, birkaç saniye sonra kodunuzu otomatik olarak kaydeder. Bu kod, http isteklerine "Hello world!" karşılama mesajıyla yanıt verir.

Uygulamanızın ilk kodu tamamlandı ve sürüm kontrolünde depolanmaya hazır.

8. Kod deposu oluştur

  1. Ekranınızın alt kısmındaki Cloud Shell terminaline dönün.
  2. Doğru dizinde olduğunuzdan emin olun:
    cd ~/codelab-genai
    
  3. Git deponuzu başlatma
    git init -b main
    
  4. GitHub CLI'ye giriş yapma
    gh auth login
    
    Varsayılan seçenekleri kabul etmek için Enter tuşuna basın ve GitHub CLI aracındaki talimatları uygulayın. Bu talimatlar şunları içerir:
    1. Hangi hesaba giriş yapmak istiyorsunuz? GitHub.com
    2. Bu ana makinede Git işlemleri için tercih ettiğiniz protokol nedir? HTTPS
    3. Git'in kimliğini GitHub kimlik bilgilerinizle mi doğrulamak istiyorsunuz? Y (Bu seçenek görünmüyorsa atlayın.)
    4. GitHub CLI'nin kimliğini nasıl doğrulamak istersiniz? Login with a web browser
    5. Tek seferlik kodunuzu kopyalayın
    6. https://github.com/login/device adresini açın.
    7. Tek seferlik kodunuzu yapıştırın
    8. Authorize github'ı (GitHub'ı yetkilendir) tıklayın.
    9. Girişinizi tamamlama
  5. Oturum açtığınızı onaylayın:
    gh api user -q ".login"
    
    Başarıyla giriş yaptıysanız bu komut, GitHub kullanıcı adınızı çıkış olarak vermelidir.
  6. GITHUB_USERNAME değişkeni oluşturma
    GITHUB_USERNAME=$(gh api user -q ".login")
    
  7. Ortam değişkenini oluşturduğunuzu onaylayın:
    echo ${GITHUB_USERNAME}
    
    Değişkeni başarıyla oluşturduysanız bu komut, GitHub kullanıcı adınızı verir.
  8. codelab-genai adlı boş bir GitHub deposu oluşturun:
    gh repo create codelab-genai --private
    
    Bu hatayı alırsanız:
    GraphQL: Name already exists on this account (createRepository)
    
    Bu durumda codelab-genai adlı bir deponuz zaten var. Bu eğitime devam etmek için iki seçeneğiniz vardır:
  9. codelab-genai deposunu uzak origin olarak ekleyin:
    git remote add origin https://github.com/${GITHUB_USERNAME}/codelab-genai
    

9. Kodunuzu paylaşma

  1. Doğru dizinde olduğunuzu onaylayın:
    cd ~/codelab-genai
    
  2. Geçerli dizindeki tüm dosyaları bu commite ekleyin:
    git add .
    
  3. İlk commit'i oluşturun:
    git commit -m "add http server"
    
  4. Kaydınızı origin deposunun main dalına aktarın:
    git push -u origin main
    

Bu komutu çalıştırabilir ve sonuçta elde edilen URL'yi ziyaret ederek GitHub'daki uygulama kodunuzu görüntüleyebilirsiniz:

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. Otomatik dağıtımları ayarlama

  1. Cloud Shell Düzenleyici sekmesini açık bırakın. Bu sekmeye daha sonra geri döneceğiz.
  2. Yeni bir sekmede Cloud Run sayfasını ziyaret edin.
  3. Konsolda doğru Google Cloud projesini seçin Google Cloud Console proje açılır listesi
  4. CONNECT REPO'yu (Depoyu bağla) tıklayın.
  5. CLOUD BUILD İLE AYARLA'yı tıklayın.
    1. Depo Sağlayıcı olarak GitHub'ı seçin.
      • Tarayıcıda GitHub hesabınıza giriş yapmadıysanız kimlik bilgilerinizle giriş yapın.
    2. Kimlik doğrulama'yı ve ardından Devam'ı tıklayın.
    3. Giriş yaptıktan sonra Cloud Run sayfasında The GitHub App is not installed on any of your repositories. (GitHub uygulaması, hiçbir deponuzda yüklü değil.) mesajını görürsünüz.
    4. GOOGLE CLOUD BUILD'U YÜKLE düğmesini tıklayın.
      • Yükleme Ayarları sayfasında Yalnızca belirli depoları seç'i belirleyin ve CLI aracılığıyla oluşturduğunuz codelab-genai deposunu seçin.
      • Yükle'yi tıklayın.
      • Not: Çok sayıda GitHub deponuz varsa bu işlemin yüklenmesi birkaç dakika sürebilir.
    5. Depo olarak your-user-name/codelab-genai seçeneğini belirleyin.
      • Depo yoksa Bağlı Depoları Yönet bağlantısını tıklayın.
    6. Branch'i ^main$ olarak bırakın.
    7. Google Cloud'un buildpack'leri aracılığıyla Go, Node.js, Python, Java, .NET Core, Ruby veya PHP'yi tıklayın.
      • Diğer alanları (Build context directory, Entrypoint ve Function target) olduğu gibi bırakın.
    8. Kaydet'i tıklayın
  6. Kimlik doğrulama'ya gidin.
  7. Kimliği doğrulanmayan çağrılara izin ver'i tıklayın.
  8. OLUŞTUR'u tıklayın.

Derleme işlemi tamamlandıktan sonra (birkaç dakika sürer) bu komutu çalıştırın ve çalışan uygulamanızı görüntülemek için sonuç URL'sini ziyaret edin:

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. Kodunuzu değiştirme

  1. Ekranınızın alt kısmındaki Cloud Shell terminaline dönün.
  2. Doğru dizinde olduğunuzdan emin olun:
    cd ~/codelab-genai
    
  3. main.go dosyasını Cloud Shell Düzenleyici'de yeniden açın.
    cloudshell edit main.go
    
  4. Go için Vertex AI SDK'yı yükleyin:
    go get cloud.google.com/go/vertexai/genai
    
  5. Geçerli proje kimliğini almak için Go'ya yönelik meta veri kitaplığını yükleyin:
    go get cloud.google.com/go/compute/metadata
    
  6. main.go dosyanızdaki kodu şu kodla değiştirin:
    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. Yeniden dağıt

  1. Cloud Shell'de doğru dizinde olduğunuzdan emin olun:
    cd ~/codelab-genai
    
  2. Uygulamanızın yeni bir sürümünü yerel Git deponuza göndermek için şu komutları çalıştırın:
    git add .
    git commit -m "add latest changes"
    
  3. Değişiklikleri GitHub'a aktarın:
    git push
    
  4. Derleme işlemi tamamlandıktan sonra şu komutu çalıştırın ve dağıtılan uygulamanızı ziyaret edin:
    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"
    

Değişikliklerinizi görebilmeniz için derlemenin tamamlanması birkaç dakika sürebilir.

Tüm düzeltmelerin geçmişini şu adreste görebilirsiniz: https://console.cloud.google.com/run/detail/us-central1/codelab-genai/revisions

13. (İsteğe bağlı) Vertex AI kullanımınızı denetleme

Diğer Google Cloud hizmetlerinde olduğu gibi Vertex AI işlemlerini denetleyebilirsiniz. Denetleme günlükleri şu sorulara yanıt vermenize yardımcı olur: "Kim neyi, nerede ve ne zaman yaptı?" Vertex AI için yönetim denetleme günlükleri varsayılan olarak etkindir. İçerik oluşturma isteklerini denetlemek için Veri Erişimi denetleme günlüklerini etkinleştirmeniz gerekir:

  1. Google Cloud Console'da Denetleme Günlükleri sayfasına gidin:

    Bu sayfayı bulmak için arama çubuğunu kullanıyorsanız alt başlığı IAM ve Yönetici olan sonucu seçin.
  2. Mevcut Google Cloud projesinin, Cloud Run uygulamanızı oluşturduğunuz proje olduğundan emin olun.
  3. Veri erişimi denetleme günlükleri yapılandırması tablosunda, Hizmet sütunundan Vertex AI API seçeneğini bulun.
  4. Günlük Türleri sekmesinde, Veri Erişimi denetleme günlüğü türleri Admin read ve Data read'ü seçin.
  5. Kaydet'i tıklayın.

Bu özelliği etkinleştirdikten sonra uygulamanın her çağrılması için denetleme günlüklerini görebilirsiniz. Çağrı ayrıntılarını içeren denetleme günlüklerini görmek için aşağıdakileri yapın:

  1. Dağıtılan uygulamanıza dönün ve günlüğü tetiklemek için sayfayı yenileyin.
  2. Google Cloud Console'da Günlük Gezgini sayfasına gidin:

  3. Sorgu penceresine şunu yazın:
    LOG_ID("cloudaudit.googleapis.com%2Fdata_access")
    protoPayload.serviceName="aiplatform.googleapis.com"
    
  4. Sorguyu çalıştır'ı tıklayın.

Denetleme günlükleri, Vertex AI API'nin kullanımını yakalar ancak istemler veya yanıt ayrıntıları gibi iş yüküyle ilgili verileri gözlemlemenize izin vermez.

14. (İsteğe bağlı) Yapay zeka iş yükünüzün gözlemlenebilirliğini artırın

Denetleme günlükleri, iş yüküyle ilgili bilgileri yakalamaz. İş yüklerinizin gözlemlenebilirliğini artırmak için bu bilgileri açıkça günlüğe kaydetmeniz gerekir. Bunu yapmak için favori günlük kaydı çerçevenizi kullanabilirsiniz. Aşağıdaki adımlarda, Go'nun yapılandırılmış günlük kaydı kitaplığı kullanılarak bu işlemin nasıl yapılacağı gösterilmektedir.

  1. main.go dosyasını Cloud Shell Düzenleyici'de yeniden açın.
    cloudshell edit ~/codelab-genai/main.go
    
  2. İçe aktarma bloğunuzu Go'nun yapılandırılmış günlük kaydı ve JSON kitaplıklarını içerecek şekilde değiştirin:
    import (
        "context"
        "encoding/json"
        "fmt"
        "log"
        "log/slog"
        "net/http"
        "os"
    
        "cloud.google.com/go/compute/metadata"
        "cloud.google.com/go/vertexai/genai"
    )
    
  3. Vertex istemcinizi başlattıktan sonra (33. satır), Google Cloud Logging için doğru alanları kullanan yapılandırılmış bir günlük kaydediciyi başlatmak üzere aşağıdaki satırları ekleyin:
    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. GenerateContent (69. satır) yanıtı kontrol edildikten sonra aşağıdaki satırları if bloğunun içine ekleyin:
    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)
    }
    
    Bu kod, yapılandırılmış günlük kaydı biçimini kullanarak oluşturulan içeriklerle ilgili stdout bilgilerini yazar. Cloud Run'daki bir günlük aracısı, stdout'ya yazdırılan çıkışı yakalar ve bu biçimi Cloud Logging'e yazar.
  5. Cloud Shell'i yeniden açın ve doğru dizinde olduğunuzdan emin olmak için aşağıdaki komutu yazın:
    cd ~/codelab-genai
    
  6. Değişiklikleri kaydedin:
    git commit -am "Observe generated content"
    
  7. Değiştirilen sürümün yeniden dağıtımını tetiklemek için değişiklikleri GitHub'a gönderin:
    git push
    

Yeni sürüm dağıtıldıktan sonra Vertex AI'a yapılan çağrılarla ilgili hata ayıklama bilgilerini gözlemleyebilirsiniz.

Uygulama günlüklerinizi görmek için şunları yapın:

  1. Google Cloud Console'da Günlük Gezgini sayfasına gidin:

  2. Sorgu penceresine şunu yazın:
    LOG_ID("run.googleapis.com%2Fstdout")
    severity=DEBUG
    
  3. Sorguyu çalıştır'ı tıklayın.

Sorgunun sonucu, güvenlik uygulamalarını izlemek için kullanılabilecek "güvenlik derecelendirmeleri" de dahil olmak üzere istem ve Vertex AI yanıtı içeren günlükleri gösterir.

15. (İsteğe bağlı) Temizleme

Cloud Run, hizmet kullanılmadığında ücret almaz ancak container görüntüsünü Artifact Registry'de depoladığınız için ücretlendirilebilirsiniz. Ücret ödememek için Cloud projenizi silebilirsiniz. Cloud projenizi sildiğinizde, bu projede kullanılan tüm kaynaklar için faturalandırma durdurulur.

İsterseniz projeyi silebilirsiniz:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Ayrıca, gereksiz kaynakları Cloud Shell diskinizden de silebilirsiniz. Şunları yapabilirsiniz:

  1. Codelab proje dizinini silin:
    rm -rf ~/codelab-genai
    
  2. Artık ihtiyacınız olmayabilecek Go paketlerini temizleyin:
    cd ~
    go clean -modcache
    
  3. Uyarı! Bu işlem geri alınamaz. Yer açmak için Cloud Shell'inizdeki her şeyi silmek istiyorsanız tüm ana dizininizi silebilirsiniz. Saklamak istediğiniz her şeyin başka bir yere kaydedildiğinden emin olun.
    sudo rm -rf $HOME
    

16. Tebrikler

Bu laboratuvarda bir web uygulaması yazdınız ve uygulamanızın kaynak kodunda değişiklik yapıldığında uygulamanızı otomatik olarak dağıtmak için Cloud Run'ı yapılandırdınız. Ardından, uygulamanızı değiştirip tekrar dağıttınız.

Bu laboratuvarı beğendiyseniz başka bir kodlama dilinde veya çerçevesinde tekrar deneyebilirsiniz:

Bugün kullandığınız ürünleri iyileştirmek için kullanıcı deneyimi (UX) araştırmasına katılmak isterseniz buradan kaydolun.

Öğrenmeye devam etmek için kullanabileceğiniz bazı seçenekler: