最佳做法:在 VPC Service Controls 範圍內執行排程工作

本頁面說明使用 VPC Service Controls 範圍時,為 Google Cloud 專案執行排定的 Cloud Run 工作時的最佳做法。

Cloud Scheduler 無法在 VPC Service Controls 範圍內觸發工作。您必須採取額外步驟才能設定排定工作。特別是,您必須透過其他元件代理要求。建議您使用 Cloud Run 服務做為 Proxy。

下圖顯示相關架構:

Cloud Run vpc sc 範圍

事前準備

設定 VPC Service Controls 專用的 Cloud Run。這是一次性設定,所有後續排定的工作都會使用這項設定。您稍後也必須進行個別服務的設定,請參閱後續操作說明。

設定排程工作

如要在 VPC Service Controls 範圍內設定排程工作,請按照下列步驟操作:

  1. 建立工作,並記下工作名稱。

  2. 完成每個工作專屬的 Cloud Run VPC Service Controls 設定。您必須將工作連結至虛擬私有雲網路,並將所有流量轉送至該網路。

    如果您沒有要觸發的現有 Cloud Run 工作,請將範例 Cloud Run 工作容器 us-docker.pkg.dev/cloudrun/container/job:latest 部署至 Cloud Run,以便測試這項功能。

  3. 部署 Cloud Run 服務,做為 Proxy。如要瞭解會在收到要求時觸發 Cloud Run 工作,以回應範例服務,請參閱範例 Proxy 服務。部署完成後,主控台會在「網址:」文字旁顯示服務的網址。

  4. 完成各服務的 Cloud Run 專屬 VPC Service Controls 設定。您必須將服務連線至虛擬私有雲網路,並透過該網路轉送所有流量。請務必將 ingress 設為「Internal」

  5. 建立 Cloud Scheduler Cron 工作,以便觸發 Cloud Run 代理服務:

    1. 前往 Cloud Scheduler 工作控制台頁面

    2. 按一下 [Create Job] (建立工作)

    3. 在「名稱」、「區域」、「頻率」和「時區」欄位中輸入所需值。詳情請參閱「使用 Cloud Scheduler 建立 Cron 工作」。

    4. 按一下「設定執行作業」

    5. 選取「Target type」(目標類型) HTTP

    6. 在「網址」中,輸入您在上一個步驟中記下的 Cloud Run 代理服務網址。

    7. 在 HTTP 方法中,選取「Get」

    8. 在「Auth header」(驗證標頭) 部分,選取「Add OIDC token」(新增 OIDC 權杖)

    9. 如要選取服務帳戶,請選取「Compute Engine 預設服務帳戶」,或具備 run.routes.invoke 權限或 Cloud Run Invoker 角色的自訂服務帳戶。

    10. 在「目標對象」中,輸入與您在上一個步驟中記下的 Cloud Run 代理服務網址相同的網址。

    11. 將所有其他欄位留空。

    12. 按一下「建立」,即可建立 Cloud Scheduler Cron 工作。

範例 Proxy 服務

以下節顯示範例 Python 服務,可代理要求並觸發 Cloud Run 工作。

  1. 建立名為 main.py 的檔案,並將下列程式碼貼入其中。將工作名稱、區域和專案 ID 更新為所需的值。

    import os
    from flask import Flask
    app = Flask(__name__)
    
    # pip install google-cloud-run
    from google.cloud import run_v2
    
    @app.route('/')
    def hello():
    
      client = run_v2.JobsClient()
    
      # UPDATE TO YOUR JOB NAME, REGION, AND PROJECT ID
      job_name = 'projects/YOUR_PROJECT_ID/locations/YOUR_JOB_REGION/jobs/YOUR_JOB_NAME'
    
      print("Triggering job...")
      request = run_v2.RunJobRequest(name=job_name)
      operation = client.run_job(request=request)
      response = operation.result()
      print(response)
      return "Done!"
    
    if __name__ == '__main__':
      app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
  2. 建立名為 requirements.txt 的檔案,將下列程式碼貼入其中:

    google-cloud-run
    flask
  3. 建立含有下列內容的 Dockerfile:

    FROM python:3.9-slim-buster
    
    WORKDIR /app
    
    COPY requirements.txt requirements.txt
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY . .
    
    CMD ["python3", "main.py"]
  4. 建構及部署容器。由於需要設定 Cloud Build 自訂工作站,因此在 VPC Service Controls 環境中設定以來源為準的部署作業可能會相當困難。如果您有現有的建構和部署管道,請使用該管道將原始碼建構至容器,並將容器部署為 Cloud Run 服務。

    如果您沒有現有的建構和部署設定,請在本機建構容器,然後推送至 Artifact Registry,例如:

    PROJECT_ID=YOUR_PROJECT_ID
    REGION=YOUR_REGION
    AR_REPO=YOUR_AR_REPO
    CLOUD_RUN_SERVICE=job-runner-service
    
    docker build -t $CLOUD_RUN_SERVICE .
    
    docker tag $CLOUD_RUN_SERVICE $REGION_ID-docker.pkg.dev/$PROJECT_ID/AR_REPO/$CLOUD_RUN_SERVICE
    
    docker push $REGION_ID-docker.pkg.dev/$PROJECT_ID/AR_REPO/$CLOUD_RUN_SERVICE

    請注意部署指令傳回的服務網址。

後續步驟

使用這項功能後,請參閱以下文章進一步瞭解: