在 Cloud Run 中建構及建立 Shell 工作

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

事前準備

  1. 安裝 Google Cloud CLI。

  2. 設定 gcloud CLI,使用您的聯合身分。

    詳情請參閱「 使用聯合身分登入 gcloud CLI」。

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

    gcloud init
  4. 建立或選取 Cloud de Confiance 專案。

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

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

      gcloud projects create PROJECT_ID

      將 PROJECT_ID 替換為您要建立的 Cloud de Confiance 專案名稱。

    • 選取您建立的 Cloud de Confiance 專案:

      gcloud config set project PROJECT_ID

      將 PROJECT_ID 替換為 Cloud de Confiance 專案名稱。

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

  6. 確認 Cloud de Confiance 專案已啟用計費功能。

  7. 啟用 Cloud Run Admin API 和 Cloud Build API (如果尚未啟用):

    啟用 API 所需的角色

    您必須具備 serviceusage.services.enable 權限,才能啟用 API。如果您建立了專案,可能已透過擁有者角色 (roles/owner) 取得這項權限。否則,您可以透過服務使用情形管理員角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

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

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

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

必要的角色

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

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

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

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

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

如要讓 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 替換為您的 Cloud de Confiance專案 ID,並將 SERVICE_ACCOUNT_EMAIL_ADDRESS 替換為 Cloud Build 服務帳戶的電子郵件地址。如果您使用 Compute Engine 預設服務帳戶做為 Cloud Build 服務帳戶,請按照下列格式輸入服務帳戶電子郵件地址:

PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com

將 PROJECT_NUMBER 替換為您的 Cloud de Confiance專案編號。

如要瞭解如何找出專案 ID 和專案編號,請參閱「建立及管理專案」。

授予 Cloud Run 建構工具角色後,需要幾分鐘的時間才會生效。

編寫範例工作

如要編寫執行殼層指令碼的 Cloud Run 工作,請按照下列步驟操作:

  1. 建立名為 jobs 的新目錄,然後切換至該目錄:

    mkdir jobs
    cd jobs
    
  2. 建立 Dockerfile 檔案,並加入下列內容:

    
    # Use the official Ubuntu image from Docker Hub as
    # a base image
    FROM ubuntu:24.04
    
    # Execute next commands in the directory /workspace
    WORKDIR /workspace
    
    # Copy over the script to the /workspace directory
    COPY script.sh .
    
    # Just in case the script doesn't have the executable bit set
    RUN chmod +x ./script.sh
    
    # Run the script when starting the container
    CMD [ "./script.sh" ]
    
  3. 在同一個目錄中,為實際工作程式碼建立 script.sh 檔案。將下列範例行複製到其中:

    #!/bin/bash
    set -euo pipefail
    
    # In production, consider printing commands as they are executed. 
    # This helps with debugging if things go wrong and you only 
    # have the logs.
    #
    # Add -x:
    # `set -euox pipefail`
    
    CLOUD_RUN_TASK_INDEX=${CLOUD_RUN_TASK_INDEX:=0}
    CLOUD_RUN_TASK_ATTEMPT=${CLOUD_RUN_TASK_ATTEMPT:=0}
    
    echo "Starting Task #${CLOUD_RUN_TASK_INDEX}, Attempt #${CLOUD_RUN_TASK_ATTEMPT}..."
    
    # SLEEP_MS and FAIL_RATE should be a decimal
    # numbers. parse and format the input using 
    # printf. 
    #
    # printf validates the input since it 
    # quits on invalid input, as shown here:
    #
    #   $: printf '%.1f' "abc"
    #   bash: printf: abc: invalid number
    #
    SLEEP_MS=$(printf '%.1f' "${SLEEP_MS:=0}")
    FAIL_RATE=$(printf '%.1f' "${FAIL_RATE:=0}")
    
    # Wait for a specific amount of time to simulate
    # performing some work
    SLEEP_SEC=$(echo print\("${SLEEP_MS}"/1000\) | perl)
    sleep "$SLEEP_SEC" # sleep accepts seconds, not milliseconds
    
    # Fail the task with a likelihood of $FAIL_RATE
    
    # Bash does not do floating point arithmetic. Use perl 
    # to convert into integer and multiply by 100.
    FAIL_RATE_INT=$(echo print\("int(${FAIL_RATE:=0}*100"\)\) | perl)
    
    # Generate a random number between 0 and 100
    RAND=$(( RANDOM % 100))
    if (( RAND < FAIL_RATE_INT )); then 
        echo "Task #${CLOUD_RUN_TASK_INDEX}, Attempt #${CLOUD_RUN_TASK_ATTEMPT} failed."
        exit 1
    else 
        echo "Completed Task #${CLOUD_RUN_TASK_INDEX}."
    fi
    

    Cloud Run 工作可讓使用者指定工作要執行的任務數量。這段程式碼範例說明如何使用內建的 CLOUD_RUN_TASK_INDEX 環境變數。每項任務代表一個執行中的容器副本。請注意,工作通常會並行執行。如果每項工作都能獨立處理資料子集,則適合使用多項工作。

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

    程式碼也示範如何使用內建的 CLOUD_RUN_TASK_ATTEMPT 環境變數重試工作,其中包含這項工作重試的次數,第一次嘗試時從 0 開始,每次重試時遞增 1,最多可達 --max-retries。

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

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

建構工作容器、傳送至 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 會模擬工作,FAIL_RATE 則會導致 X% 的工作失敗,方便您實驗平行處理及重試失敗的工作。

在 Cloud Run 執行工作

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

gcloud run jobs execute job-quickstart --region REGION

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

清除所用資源

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

刪除存放區

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

刪除工作

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

控制台

如要刪除工作:

  1. 前往 Cloud de Confiance by S3NS 控制台的「Cloud Run」頁面:

    前往 Cloud Run。

  2. 在工作清單中找到要刪除的工作,然後勾選核取方塊加以選取。

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

gcloud

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

gcloud run jobs delete JOB_NAME

將 JOB_NAME 替換為工作名稱。

刪除測試專案

刪除 Cloud de Confiance 專案後,系統會停止對該專案中的所有資源計費。如要釋出專案中的所有 Cloud de Confiance by S3NS 資源,請按照下列步驟操作:

    刪除 Cloud de Confiance 專案:

    gcloud projects delete PROJECT_ID

後續步驟

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