如何在 VPC Service Controls 範圍內排定 Cloud Run 工作

1. 簡介

總覽

如果您的 GCP 專案位於 VPC SC 範圍內,則需要採取額外步驟才能設定排程工作。由於 Cloud Scheduler 無法直接在 VPC SC 範圍內觸發工作,因此您必須透過其他元件代理要求。建議您使用 Cloud Run 服務做為這個 Proxy。

架構如下所示:

圖表:Cloud Scheduler 觸發執行 Cloud Run 工作的 Cloud Run 服務

課程內容

  • 如何在虛擬私有雲 SC 範圍內依排程執行 Cloud Run 工作
  • 如何建立 Cloud Run 服務,以便使用 Cloud Run 用戶端程式庫觸發 Cloud Run 工作
  • 如何設定 Cloud Scheduler,按照時間表叫用 Cloud Run 服務

2. 事前準備

首先,請確認您已按照步驟設定 VPC Service Controls 的 Cloud Run。

接著,設定在本程式碼研究室中會用到的環境變數。

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 工作容器。

首先,請為 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 服務

在這個步驟中,您將部署 Cloud Run 服務,做為 Proxy。

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 Scheduler 工作來觸發服務

# 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 Scheduler 頁面中追蹤其狀態。

執行下列指令,確認 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 工作
  • 如何建立 Cloud Run 服務,以便使用 Cloud Run 用戶端程式庫觸發 Cloud Run 工作
  • 如何設定 Cloud Scheduler,按照時間表叫用 Cloud Run 服務

8. 清理

為避免產生意外費用 (例如,如果 Cloud Run 服務在免費方案中意外呼叫的次數超過每月分配的呼叫次數),您可以刪除 GCP 服務,或是刪除在步驟 2 中建立的專案。

如要刪除 Cloud Run 服務和 Cloud Run 工作,請前往 Cloud Run 雲端控制台 (https://console.cloud.google.com/run) 並刪除服務。

如果您選擇刪除整個專案,可以前往 https://console.cloud.google.com/cloud-resource-manager,選取您在步驟 2 中建立的專案,然後選擇「Delete」(刪除)。如果您刪除專案,就必須在 Cloud SDK 中變更專案。您可以執行 gcloud projects list 來查看所有可用專案的清單。