1. 簡介
總覽
如果 GCP 專案位於 VPC SC 服務範圍內,您必須採取額外步驟才能設定排程工作。由於 Cloud Scheduler 無法直接在 VPC SC 邊界內觸發工作,因此您需要透過其他元件將要求設為 Proxy。建議使用 Cloud Run 服務做為這個 Proxy。
架構如下所示:

課程內容
- 如何在虛擬私有雲 SC 範圍內,排定時間執行 Cloud Run Job
- 如何使用 Cloud Run 用戶端程式庫,建立會觸發 Cloud Run 工作的 Cloud Run 服務
- 如何設定 Cloud Scheduler,依排程叫用 Cloud Run 服務
2. 事前準備
首先,請確認您已按照步驟設定 Cloud Run for VPC Service Controls。
接著設定本程式碼研究室全程會用到的環境變數。
PROJECT_ID=<YOUR_PROJECT_ID> REGION=<YOUR_REGION> AR_REPO=sample-job-repo CLOUD_RUN_SERVICE=job-runner-service CLOUD_RUN_JOB=sample-job CLOUD_SCHEDULER=job-scheduler SERVICE_ACCOUNT="cloud-run-invoker-sa" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com NETWORK=default SUBNET=default
3. 建立 Cloud Run 工作
本程式碼研究室使用 Cloud Run Jobs 範例容器。
首先,請為 Cloud Run 工作容器建立 Artifact Registry 存放區。
gcloud artifacts repositories create $AR_REPO --repository-format=docker --location=$REGION --description="codelab for Cloud Run jobs on schedule within VPC SC"
接著,將 Cloud Run 作業容器範例複製到 VPC SC 設定專案中的 Artifact Registry。您可以按照這些安裝說明,使用 gcrane 工具執行這項操作。如要進一步瞭解 gcrane,請參閱「在存放區之間複製映像檔」說明文件。
gcrane cp us-docker.pkg.dev/cloudrun/container/job:latest $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest
其次,部署符合 VPC Service Controls 規範的 Cloud Run 作業。
gcloud run jobs create $CLOUD_RUN_JOB --region $REGION \ --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest \ --network=$NETWORK \ --subnet=$SUBNET \ --vpc-egress=all-traffic
如要進一步瞭解如何建立工作,請按照 Cloud Run 工作說明文件中的步驟操作。
4. 建立服務帳戶
Cloud Run 會使用這個服務帳戶呼叫 Cloud Run 工作。
首先,請執行下列指令來建立服務帳戶:
gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Cloud Run to run a Cloud Run job"
其次,將 Cloud Run 叫用者角色和 Cloud Run 檢視者角色授予服務帳戶。
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.invoker gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.viewer
5. 建立 Cloud Run 服務
在這個步驟中,您將部署做為 Proxy 的 Cloud Run 服務。
mkdir job-runner-service && cd $_
建立名為 main.py 的檔案,並加入以下程式碼。
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)))
建立名為 requirements.txt 的檔案,並在其中加入下列程式碼。
google-cloud-run flask
最後,建立 Dockerfile。
FROM python:3.9-slim-buster # for logging purposes ENV PYTHONUNBUFFERED=True WORKDIR /app COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["python3", "main.py"]
接著,使用下列 Docker 指令建構容器。請注意,在 VPC SC 環境中,可能難以設定以來源為基礎的部署作業。如果您有現有的建構及部署管道,請使用該管道將原始碼建構為容器,並將容器部署為 Cloud Run 服務。
docker build -t $CLOUD_RUN_SERVICE . docker tag $CLOUD_RUN_SERVICE $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE docker push $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE
現在請部署符合 VPC Service Controls 規範的 Cloud Run 服務。
gcloud run deploy $CLOUD_RUN_SERVICE --region $REGION \ --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE \ --service-account $SERVICE_ACCOUNT_ADDRESS \ --network=$NETWORK \ --subnet=$SUBNET \ --vpc-egress=all-traffic \ --no-allow-unauthenticated \ --ingress internal
執行下列指令,儲存服務端點網址:
SERVICE_URL=$(gcloud run services describe $CLOUD_RUN_SERVICE --region $REGION --format 'value(status.url)')
6. 建立 Cloud Schedule 工作來觸發服務
# create the Cloud Scheduler job gcloud scheduler jobs create http $CLOUD_SCHEDULER \ --location=$REGION \ --schedule="0 0 1 * *" \ --uri=$SERVICE_URL \ --http-method=GET \ --oidc-service-account-email=$SERVICE_ACCOUNT_ADDRESS
建立 Cloud Scheduler 工作後,您可以執行下列指令,立即執行 Cloud Scheduler 工作以進行測試:
gcloud scheduler jobs run $CLOUD_SCHEDULER --location=$REGION
注意:
您可能需要等待幾分鐘,工作執行作業才會完成。您可以在 Cloud Run 排程器頁面追蹤狀態。
執行下列指令,確認 Cloud Run 工作是否順利執行:
EXECUTION_NAME=$(gcloud run jobs describe $CLOUD_RUN_JOB --region $REGION --format 'value(status.latestCreatedExecution.name)') gcloud run jobs executions describe $EXECUTION_NAME --region $REGION
您應該會看到類似下列內容:
✔ Execution sample-job-w6hrj in region us-central1 1 task completed successfully Elapsed time: 28 seconds
7. 恭喜!
恭喜您完成本程式碼研究室!
涵蓋內容
- 如何在虛擬私有雲 SC 範圍內,排定時間執行 Cloud Run Job
- 如何使用 Cloud Run 用戶端程式庫,建立會觸發 Cloud Run 工作的 Cloud Run 服務
- 如何設定 Cloud Scheduler,依排程叫用 Cloud Run 服務
8. 清理
為避免產生意外費用 (例如,Cloud Run 服務的叫用次數不慎超過免費層級的每月 Cloud Run 叫用配額),您可以刪除 GCP 服務,或刪除步驟 2 中建立的專案。
如要刪除 Cloud Run 服務和 Cloud Run 工作,請前往 Cloud Run Cloud 控制台 (https://console.cloud.google.com/run) 並刪除服務。
如要刪除整個專案,請前往 https://console.cloud.google.com/cloud-resource-manager,選取您在步驟 2 中建立的專案,然後選擇「刪除」。刪除專案後,您必須在 Cloud SDK 中變更專案。如要查看所有可用專案的清單,請執行 gcloud projects list。