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

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

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

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

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

    gcloud init
  5. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

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

  7. 確認專案已啟用計費功能 Google Cloud

  8. 安裝 Google Cloud CLI。

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

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

    gcloud init
  11. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

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

  13. 確認專案已啟用計費功能 Google Cloud

  14. 啟用 Cloud Run Admin API 和 Cloud Build API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

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

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

  15. 查看 Cloud Run 定價,或使用 Pricing Calculator 估算費用。

必要的角色

如要取得完成本快速入門導覽課程所需的權限,請要求管理員授予您下列 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 資源,請按照下列步驟操作:

    刪除 Google Cloud 專案:

    gcloud projects delete PROJECT_ID

後續步驟

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