在 Cloud Run 中建構及建立 Node.js 工作

瞭解如何建立簡單的 Cloud Run 作業,然後從來源部署,這會自動將程式碼封裝到容器映像檔中、將容器映像檔上傳至 Artifact Registry,然後部署至 Cloud Run。您也可以使用其他語言。

事前準備

  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. Install the Google Cloud CLI.

  3. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  4. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. 如要使用現有專案進行本指南中的操作,請確認您具有所需的權限。如果您建立新專案,則已具備必要權限。

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

  8. Install the Google Cloud CLI.

  9. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  10. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  11. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. 如要使用現有專案進行本指南中的操作,請確認您具有所需的權限。如果您建立新專案,則已具備必要權限。

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

  14. Enable the Cloud Run Admin API and Cloud Build APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

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

    啟用 Cloud Run Admin API 後,系統會自動建立 Compute Engine 預設服務帳戶。

  15. 查看 Cloud Run 定價,或使用 Pricing Calculator 估算費用。
  16. 必要的角色

    如要取得完成本快速入門導覽課程所需的權限,請要求管理員授予您下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

    您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

    授予 Cloud Build 服務帳戶專案存取權

    除非您覆寫這項行為,否則 Cloud Build 會自動使用 Compute Engine 預設服務帳戶做為預設的 Cloud Build 服務帳戶,建構您的原始碼和 Cloud Run 資源。

    如要讓 Cloud Build 建構來源,請在專案中將 Cloud Run 建構者 (roles/run.builder) 角色授予 Cloud Build 服務帳戶:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS \
        --role=roles/run.builder

    PROJECT_ID 替換為您的 Google Cloud專案 ID,並將 SERVICE_ACCOUNT_EMAIL_ADDRESS 替換為 Cloud Build 服務帳戶的電子郵件地址。如果您使用 Compute Engine 預設服務帳戶做為 Cloud Build 服務帳戶,請使用下列格式的服務帳戶電子郵件地址:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER 替換為您的專案編號。 Google Cloud

    如需如何找出專案 ID 和專案編號的詳細操作說明,請參閱「建立與管理專案」。

    授予 Cloud Run 建構工具角色需要幾分鐘才能傳播

    撰寫範例工作

    如要使用 Node.js 編寫工作,請按照下列步驟操作:

    1. 建立名為 jobs 的新目錄,然後將目錄變更為該目錄:

      mkdir jobs
      cd jobs
      
    2. 使用以下內容建立 package.json 檔案:

      {
          "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. 在同一個目錄中,建立 index.js 檔案做為實際工作程式碼。將下列範例行複製到該檔案中:

      // 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
      });

      使用者可以透過 Cloud Run 工作指定工作要執行的工作數量。這個程式碼範例說明如何使用內建的 CLOUD_RUN_TASK_INDEX 環境變數。每個工作都代表一個正在執行的容器副本。 請注意,工作通常會並行執行。如果每個工作都能獨立處理資料子集,使用多個工作就很有用。

      每項工作都會知道自己的索引,並儲存在 CLOUD_RUN_TASK_INDEX 環境變數中。內建的 CLOUD_RUN_TASK_COUNT 環境變數包含工作執行期間透過 --tasks 參數提供的任務數量。

      程式碼也顯示如何使用內建的 CLOUD_RUN_TASK_ATTEMPT 環境變數重試工作。這個變數包含這項工作重試的次數,第一次嘗試時為 0,每次重試都會遞增 1,最多為 --max-retries

      您也可以透過程式碼產生失敗,測試重試機制並產生錯誤記錄,瞭解錯誤記錄的樣貌。

    4. 建立 Procfile,並加入以下內容:

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

    程式碼已完成,可以封裝在容器中。

    建構工作容器、傳送至 Artifact Registry,並部署至 Cloud Run

    本快速入門導覽課程使用從來源部署功能,該功能會建構容器、將容器上傳至 Artifact Registry,並將工作部署至 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

    其中 PROJECT_ID 是您的專案 ID,REGION 則是您的區域,例如 europe-west1。請注意,您可以將各種參數變更為您想用於測試的值。SLEEP_MS 會模擬工作,並導致 X% 的工作失敗,方便您實驗平行處理和重試失敗工作。FAIL_RATE

    在 Cloud Run 中執行工作

    如要執行剛建立的工作,請按照下列步驟操作:

    gcloud run jobs execute job-quickstart --region REGION

    REGION 替換為您在建立及部署工作時使用的區域,例如 europe-west1

    清除所用資源

    為避免系統向您的 Google Cloud 帳戶收取額外費用,請刪除您透過本快速入門導覽課程部署的所有資源。

    刪除存放區

    Cloud Run 只會針對工作執行時間收費。不過,您可能仍須支付在 Artifact Registry 中儲存容器映像檔的費用。如要刪除 Artifact Registry 存放區,請按照 Artifact Registry 說明文件中的「刪除存放區」一節操作。

    刪除工作

    只有在執行工作時,Cloud Run 工作才會產生費用。 如要刪除 Cloud Run 工作,請按照下列步驟操作:

    控制台

    如要刪除工作:

    1. 前往 Google Cloud 控制台的 Cloud Run:

      前往 Cloud Run

    2. 在工作清單中找出要刪除的工作,然後按一下核取方塊來選取。

    3. 按一下「Delete」(刪除)。這會終止所有進行中的工作執行作業和所有執行中的容器執行個體。

    gcloud

    如要刪除 Job,請執行下列指令:

    gcloud run jobs delete JOB_NAME

    JOB_NAME 改為工作名稱。

    刪除測試專案

    刪除專案後,系統就會停止對該專案中的所有資源收取費用。 Google Cloud 如要釋出專案中的所有 Google Cloud 資源,請按照下列步驟操作:

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    後續步驟

    如要進一步瞭解如何從程式碼來源建構容器並推送至存放區,請參閱: