Bangun dan buat tugas Node.js 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, dan lalu men-deploy ke Cloud Run. Anda dapat menggunakan bahasa lain selain yang telah ditampilkan.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Menginstal Google Cloud CLI.
  5. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init
  6. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  7. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  8. Menginstal Google Cloud CLI.
  9. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init

Menulis contoh tugas

Untuk menulis tugas di Node.js:

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

    mkdir jobs
    cd jobs
    
  2. Buat file package.json dengan konten berikut:

    {
        "name": "jobs",
        "version": "1.0.0",
        "description": "Node.js sample for Cloud Run jobs",
        "main": "index.js",
        "scripts": {
            "start": "node index.js"
        },
        "engines": {
            "node": ">=16.0.0"
        },
        "author": "Google LLC",
        "license": "Apache-2.0"
    }
    
  3. Dalam direktori yang sama, buat file index.js untuk kode tugas yang sebenarnya. Salin baris contoh berikut ke dalamnya:

    // Retrieve Job-defined env vars
    const {CLOUD_RUN_TASK_INDEX = 0, CLOUD_RUN_TASK_ATTEMPT = 0} = process.env;
    // Retrieve User-defined env vars
    const {SLEEP_MS, FAIL_RATE} = process.env;
    
    // Define main script
    const main = async () => {
      console.log(
        `Starting Task #${CLOUD_RUN_TASK_INDEX}, Attempt #${CLOUD_RUN_TASK_ATTEMPT}...`
      );
      // Simulate work
      if (SLEEP_MS) {
        await sleep(SLEEP_MS);
      }
      // Simulate errors
      if (FAIL_RATE) {
        try {
          randomFailure(FAIL_RATE);
        } catch (err) {
          err.message = `Task #${CLOUD_RUN_TASK_INDEX}, Attempt #${CLOUD_RUN_TASK_ATTEMPT} failed.\n\n${err.message}`;
          throw err;
        }
      }
      console.log(`Completed Task #${CLOUD_RUN_TASK_INDEX}.`);
    };
    
    // Wait for a specific amount of time
    const sleep = ms => {
      return new Promise(resolve => setTimeout(resolve, ms));
    };
    
    // Throw an error based on fail rate
    const randomFailure = rate => {
      rate = parseFloat(rate);
      if (!rate || rate < 0 || rate > 1) {
        console.warn(
          `Invalid FAIL_RATE env var value: ${rate}. Must be a float between 0 and 1 inclusive.`
        );
        return;
      }
    
      const randomFailure = Math.random();
      if (randomFailure < rate) {
        throw new Error('Task failed.');
      }
    };
    
    // Start script
    main().catch(err => {
      console.error(err);
      process.exit(1); // Retry Job Task by exiting the process
    });

    Tugas Cloud Run mengizinkan pengguna untuk menentukan jumlah tugas yang akan dieksekusi 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.

  4. Buat Procfile dengan konten berikut:

    # Define the application's entrypoint to override default, `npm start`
    # https://github.com/GoogleCloudPlatform/buildpacks/issues/160
    web: node index.js
    

Kode Anda sudah lengkap dan siap 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 izin deployment Cloud Run, izin Cloud Build, dan izin Artifact Registry untuk izin yang diperlukan.

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, us-central1. Perhatikan bahwa Anda dapat mengubah berbagai parameter menjadi nilai apa pun yang Anda ingin gunakan untuk tujuan pengujian Anda. 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 us-central1.

Langkah selanjutnya

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