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

瞭解如何建立簡單的 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. 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. Make sure that you have the following role or roles on the project: Cloud Run Admin, Cloud Run Source Developer, Logs Viewer

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      前往「IAM」頁面
    2. 選取專案。
    3. 按一下「授予存取權」
    4. 在「New principals」(新增主體) 欄位中,輸入您的使用者 ID。 這通常是 Google 帳戶的電子郵件地址。

    5. 在「Select a role」(選取角色) 清單中,選取角色。
    6. 如要授予其他角色,請按一下 「新增其他角色」,然後新增每個其他角色。
    7. 按一下 [Save]
  5. Install the Google Cloud CLI.

  6. 如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

  7. 如要初始化 gcloud CLI,請執行下列指令:

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

    Go to project selector

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

  10. Make sure that you have the following role or roles on the project: Cloud Run Admin, Cloud Run Source Developer, Logs Viewer

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      前往「IAM」頁面
    2. 選取專案。
    3. 按一下「授予存取權」
    4. 在「New principals」(新增主體) 欄位中,輸入您的使用者 ID。 這通常是 Google 帳戶的電子郵件地址。

    5. 在「Select a role」(選取角色) 清單中,選取角色。
    6. 如要授予其他角色,請按一下 「新增其他角色」,然後新增每個其他角色。
    7. 按一下 [Save]
  11. Install the Google Cloud CLI.

  12. 如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

  13. 如要初始化 gcloud CLI,請執行下列指令:

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

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

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

  15. 請確認您已獲得服務身分的服務帳戶使用者角色。根據預設,服務身分是 Compute Engine 預設服務帳戶。

    授予角色

    如要授予服務身分資源的存取權,請使用 gcloud iam service-accounts add-iam-policy-binding 指令,並將醒目顯示的變數替換為適當的值:

          gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
              --member="PRINCIPAL" \
              --role="roles/iam.serviceAccountUser"
          

    更改下列內容:

    • SERVICE_ACCOUNT_EMAIL:您用來做為服務身分的服務帳戶電子郵件地址,例如:
      • Compute Engine 預設服務帳戶:PROJECT_NUMBER-compute@developer.gserviceaccount.com
      • 您建立的服務帳戶:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    • PRINCIPAL:使用者 ID。這通常是 Google 帳戶的電子郵件地址。
  16. 將下列 IAM 角色授予 Cloud Build 服務帳戶。

    按一下即可查看 Cloud Build 服務帳戶的必要角色

    除非您覆寫這項行為,否則 Cloud Build 會自動使用 Compute Engine 預設服務帳戶做為預設的 Cloud Build 服務帳戶,建構您的原始碼和 Cloud Run 資源。如要讓 Cloud Build 建構來源,請要求管理員將 Cloud Run Builder (roles/run.builder) 授予專案中的 Compute Engine 預設服務帳戶:

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

    請將 PROJECT_NUMBER 替換為專案編號,並將 PROJECT_ID 替換為專案 ID。 Google CloudGoogle Cloud如需如何找出專案 ID 和專案編號的詳細操作說明,請參閱「建立及管理專案」。

    將 Cloud Run 建構者角色授予 Compute Engine 預設服務帳戶後,需要幾分鐘才能傳播

  17. 撰寫範例工作

    如要以 Python 編寫工作,請按照下列步驟操作:

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

      mkdir jobs
      cd jobs
      
    2. 為實際工作程式碼建立 main.py 檔案。將下列範例行複製到檔案中:

      import json
      import os
      import random
      import sys
      import time
      
      # Retrieve Job-defined env vars
      TASK_INDEX = os.getenv("CLOUD_RUN_TASK_INDEX", 0)
      TASK_ATTEMPT = os.getenv("CLOUD_RUN_TASK_ATTEMPT", 0)
      # Retrieve User-defined env vars
      SLEEP_MS = os.getenv("SLEEP_MS", 0)
      FAIL_RATE = os.getenv("FAIL_RATE", 0)
      
      
      # Define main script
      def main(sleep_ms=0, fail_rate=0):
          """Program that simulates work using the sleep method and random failures.
      
          Args:
              sleep_ms: number of milliseconds to sleep
              fail_rate: rate of simulated errors
          """
          print(f"Starting Task #{TASK_INDEX}, Attempt #{TASK_ATTEMPT}...")
          # Simulate work by waiting for a specific amount of time
          time.sleep(float(sleep_ms) / 1000)  # Convert to seconds
      
          # Simulate errors
          random_failure(float(fail_rate))
      
          print(f"Completed Task #{TASK_INDEX}.")
      
      
      def random_failure(rate):
          """Throws an error based on fail rate
      
          Args:
              rate: a float between 0 and 1
          """
          if rate < 0 or rate > 1:
              # Return without retrying the Job Task
              print(
                  f"Invalid FAIL_RATE env var value: {rate}. "
                  + "Must be a float between 0 and 1 inclusive."
              )
              return
      
          random_failure = random.random()
          if random_failure < rate:
              raise Exception("Task failed.")
      
      
      # Start script
      if __name__ == "__main__":
          try:
              main(SLEEP_MS, FAIL_RATE)
          except Exception as err:
              message = (
                  f"Task #{TASK_INDEX}, " + f"Attempt #{TASK_ATTEMPT} failed: {str(err)}"
              )
      
              print(json.dumps({"message": message, "severity": "ERROR"}))
              sys.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

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

    3. 建立名為 Procfile 的文字檔 (不含副檔名),並在當中加入下列內容:

      web: python3 main.py

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

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

    重要事項:本快速入門導覽課程假設您在用於快速入門導覽課程的專案中,具備擁有者或編輯者角色。否則,請參閱 Cloud Run Source Developer 角色,瞭解從來源部署 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

    後續步驟

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