Membangun dan membuat tugas Go di Cloud Run

Pelajari cara membuat tugas Cloud Run sederhana, lalu men-deploy dari sumber, yang secara otomatis mengemas kode Anda ke dalam image container, mengupload image container ke Artifact Registry, lalu men-deploy ke Cloud Run. Anda dapat menggunakan bahasa lain selain yang telah ditampilkan.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.

  5. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  6. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Verify that billing is enabled for your Google Cloud project.

  9. Install the Google Cloud CLI.

  10. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  11. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  12. Aktifkan Cloud Run Admin API dan Cloud Build API:

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

    Setelah Cloud Run Admin API diaktifkan, akun layanan default Compute Engine akan dibuat secara otomatis.

  13. Berikan peran IAM berikut kepada akun layanan Cloud Build.

    Klik untuk melihat peran yang diperlukan untuk akun layanan Cloud Build

    Cloud Build secara otomatis menggunakan akun layanan default Compute Engine sebagai akun layanan Cloud Build default untuk membangun kode sumber dan resource Cloud Run, kecuali jika Anda mengganti perilaku ini. Agar Cloud Build dapat membangun sumber Anda, minta administrator Anda untuk memberikan peran Cloud Run Builder (roles/run.builder) ke akun layanan default Compute Engine di project Anda:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
          --role=roles/run.builder
      

    Ganti PROJECT_NUMBER dengan Google Cloud nomor project Anda, dan PROJECT_ID dengan Google Cloud project ID Anda. Untuk mengetahui petunjuk mendetail tentang cara menemukan project ID dan nomor project Anda, lihat Membuat dan mengelola project.

    Pemberian peran builder Cloud Run ke akun layanan default Compute Engine memerlukan waktu beberapa menit untuk berlaku.

  14. Menulis contoh tugas

    Untuk menulis tugas di Go:

    1. Buat sebuah direktori baru bernama jobs dan ubah ke direktori tersebut:

      mkdir jobs
      cd jobs
      
    2. Dalam direktori yang sama, buat file main.go untuk kode tugas yang sebenarnya. Salin baris contoh berikut ke dalamnya:

      package main
      
      import (
      	"fmt"
      	"log"
      	"math/rand"
      	"os"
      	"strconv"
      	"time"
      )
      
      type Config struct {
      	// Job-defined
      	taskNum    string
      	attemptNum string
      
      	// User-defined
      	sleepMs  int64
      	failRate float64
      }
      
      func configFromEnv() (Config, error) {
      	// Job-defined
      	taskNum := os.Getenv("CLOUD_RUN_TASK_INDEX")
      	attemptNum := os.Getenv("CLOUD_RUN_TASK_ATTEMPT")
      	// User-defined
      	sleepMs, err := sleepMsToInt(os.Getenv("SLEEP_MS"))
      	failRate, err := failRateToFloat(os.Getenv("FAIL_RATE"))
      
      	if err != nil {
      		return Config{}, err
      	}
      
      	config := Config{
      		taskNum:    taskNum,
      		attemptNum: attemptNum,
      		sleepMs:    sleepMs,
      		failRate:   failRate,
      	}
      	return config, nil
      }
      
      func sleepMsToInt(s string) (int64, error) {
      	sleepMs, err := strconv.ParseInt(s, 10, 64)
      	return sleepMs, err
      }
      
      func failRateToFloat(s string) (float64, error) {
      	// Default empty variable to 0
      	if s == "" {
      		return 0, nil
      	}
      
      	// Convert string to float
      	failRate, err := strconv.ParseFloat(s, 64)
      
      	// Check that rate is valid
      	if failRate < 0 || failRate > 1 {
      		return failRate, fmt.Errorf("Invalid FAIL_RATE value: %f. Must be a float between 0 and 1 inclusive.", failRate)
      	}
      
      	return failRate, err
      }
      
      func main() {
      	config, err := configFromEnv()
      	if err != nil {
      		log.Fatal(err)
      	}
      
      	log.Printf("Starting Task #%s, Attempt #%s ...", config.taskNum, config.attemptNum)
      
      	// Simulate work
      	if config.sleepMs > 0 {
      		time.Sleep(time.Duration(config.sleepMs) * time.Millisecond)
      	}
      
      	// Simulate errors
      	if config.failRate > 0 {
      		if failure := randomFailure(config); failure != nil {
      			log.Fatalf("%v", failure)
      		}
      	}
      
      	log.Printf("Completed Task #%s, Attempt #%s", config.taskNum, config.attemptNum)
      }
      
      // Throw an error based on fail rate
      func randomFailure(config Config) error {
      	rand.Seed(time.Now().UnixNano())
      	randomFailure := rand.Float64()
      
      	if randomFailure < config.failRate {
      		return fmt.Errorf("Task #%s, Attempt #%s failed.", config.taskNum, config.attemptNum)
      	}
      	return nil
      }
      

      Tugas Cloud Run mengizinkan pengguna untuk menentukan jumlah tugas yang akan dijalankan oleh tugas tersebut. Kode contoh ini menunjukkan cara menggunakan variabel lingkungan CLOUD_RUN_TASK_INDEX bawaan. Setiap tugas mewakili satu salinan container yang berjalan. Perhatikan bahwa tugas-tugas biasanya dijalankan secara paralel. Menggunakan beberapa tugas akan berguna jika setiap tugas dapat memproses subset data Anda secara independen.

      Setiap tugas mengetahui indeksnya, yang disimpan dalam variabel lingkungan CLOUD_RUN_TASK_INDEX. Variabel lingkungan CLOUD_RUN_TASK_COUNT bawaan berisi jumlah tugas yang disediakan pada waktu eksekusi tugas melalui parameter --tasks.

      Kode yang ditampilkan juga menunjukkan cara mencoba ulang tugas, menggunakan variabel lingkungan CLOUD_RUN_TASK_ATTEMPT bawaan yang berisi berapa kali tugas ini telah dicoba ulang, mulai dari 0 untuk upaya pertama dan bertambah 1 untuk setiap percobaan ulang berturut-turut yang berhasil, hingga --max-retries.

      Kode ini juga memungkinkan Anda menghasilkan kegagalan sebagai cara untuk menguji percobaan ulang dan membuat log error sehingga Anda dapat melihat tampilannya.

    3. Buat file go.mod dengan konten berikut:

      module github.com/GoogleCloudPlatform/golang-samples/run/jobs
      
      go 1.23.0
      

    Kode Anda telah lengkap dan siap untuk dikemas dalam container.

    Bangun container tugas, kirim ke Artifact Registry, lalu deploy ke Cloud Run

    Penting: Panduan memulai ini mengasumsikan bahwa Anda memiliki peran pemilik atau editor dalam project yang Anda gunakan untuk panduan memulai tersebut. Atau, lihat peran Developer Sumber Cloud Run untuk izin yang diperlukan guna men-deploy resource Cloud Run dari sumber.

    Panduan memulai ini menggunakan deploy dari sumber, yang membuat container, mengunggahnya ke Artifact Registry, dan men-deploy tugas tersebut ke Cloud Run:

    gcloud run jobs deploy job-quickstart \
        --source . \
        --tasks 50 \
        --set-env-vars SLEEP_MS=10000 \
        --set-env-vars FAIL_RATE=0.1 \
        --max-retries 5 \
        --region REGION \
        --project=PROJECT_ID

    dengan PROJECT_ID sebagai project ID Anda dan REGION adalah region Anda , misalnya, europe-west1. Perhatikan bahwa Anda dapat mengubah berbagai parameter menjadi nilai apa pun yang ingin Anda gunakan untuk tujuan pengujian. SLEEP_MS menyimulasikan pekerjaan dan FAIL_RATE menyebabkan X% tugas gagal sehingga Anda dapat bereksperimen dengan paralelisme dan mencoba ulang tugas yang gagal.

    Menjalankan tugas di Cloud Run

    Untuk menjalankan tugas yang baru saja Anda buat:

    gcloud run jobs execute job-quickstart --region REGION

    Ganti REGION dengan region yang Anda gunakan saat membuat dan men-deploy tugas, misalnya europe-west1.

    Langkah berikutnya

    Untuk informasi lebih lanjut dalam mem-build container dari kode sumber dan penerapan untuk repositori, lihat: