Cloud Run-Job innerhalb eines VPC Service Controls-Perimeters planen

1. Einführung

Übersicht

Wenn sich Ihr GCP-Projekt in einem VPC SC-Perimeter befindet, müssen Sie zusätzliche Schritte ausführen, um geplante Jobs einzurichten. Da Cloud Scheduler Jobs innerhalb von VPC SC-Perimetern nicht direkt auslösen kann, müssen Sie die Anfrage über eine andere Komponente weiterleiten. Wir empfehlen, einen Cloud Run-Dienst als Proxy zu verwenden.

Die Architektur sieht so aus:

Diagramm, in dem Cloud Scheduler einen Cloud Run-Dienst auslöst, der einen Cloud Run-Job ausführt

Aufgaben in diesem Lab

  • Cloud Run-Job nach Zeitplan innerhalb eines VPC SC-Perimeters ausführen
  • Cloud Run-Dienst erstellen, der mithilfe der Cloud Run-Clientbibliotheken einen Cloud Run-Job auslöst
  • Cloud Scheduler so konfigurieren, dass ein Cloud Run-Dienst nach Zeitplan aufgerufen wird

2. Hinweis

Prüfen Sie zuerst, ob Sie die Schritte zur Einrichtung von Cloud Run für VPC Service Controls ausgeführt haben.

Legen Sie als Nächstes Umgebungsvariablen fest, die in diesem Codelab verwendet werden.

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-Job erstellen

In diesem Codelab wird der Beispielcontainer für Cloud Run-Jobs verwendet.

Erstellen Sie zuerst ein Artifact Registry-Repository für Ihren Cloud Run-Jobcontainer.

gcloud artifacts repositories create $AR_REPO --repository-format=docker --location=$REGION --description="codelab for Cloud Run jobs on schedule within VPC SC"

Kopieren Sie als Nächstes den Beispielcontainer für Cloud Run-Jobs in eine Artifact Registry in Ihrem mit VPC SC konfigurierten Projekt. Sie können dazu das gcrane-Tool verwenden. Folgen Sie dazu dieser Installationsanleitung. Weitere Informationen zu gcrane finden Sie in der Dokumentation zum Kopieren von Images zwischen Repositories.

gcrane cp us-docker.pkg.dev/cloudrun/container/job:latest $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest

Zweitens: Stellen Sie Ihren Cloud Run-Job bereit, der VPC Service Controls entspricht.

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

Weitere Informationen zum Erstellen von Jobs finden Sie in der Dokumentation zu Cloud Run-Jobs.

4. Dienstkonto erstellen

Dieses Dienstkonto wird von Cloud Run zum Aufrufen des Cloud Run-Jobs verwendet.

Erstellen Sie zuerst das Dienstkonto mit dem folgenden Befehl:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run to run a Cloud Run job"

Zweitens gewähren Sie dem Dienstkonto die Rolle „Cloud Run-Aufrufer“ und die Rolle „Cloud Run-Betrachter“.

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-Dienst erstellen

In diesem Schritt stellen Sie einen Cloud Run-Dienst bereit, der als Proxy dient.

mkdir job-runner-service && cd $_

Erstellen Sie eine Datei mit dem Namen main.py und folgendem Code.

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)))

Erstellen Sie eine Datei mit dem Namen requirements.txt und folgendem Code.

google-cloud-run
flask

Erstellen Sie zum Schluss eine 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"]

Erstellen Sie den Container mit den folgenden Docker-Befehlen. Quellbasierte Bereitstellungen können in einer VPC SC-Umgebung schwierig einzurichten sein. Wenn Sie bereits eine Build- und Bereitstellungspipeline haben, verwenden Sie diese, um den Quellcode in einem Container zu erstellen und den Container als Cloud Run-Dienst bereitzustellen.

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

Stellen Sie nun Ihren Cloud Run-Dienst bereit, der VPC Service Controls entspricht.

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

Speichern Sie die Dienstendpunkt-URL mit dem folgenden Befehl:

SERVICE_URL=$(gcloud run services describe $CLOUD_RUN_SERVICE --region $REGION --format 'value(status.url)')

6. Cloud Scheduler-Job zum Auslösen des Dienstes erstellen

# 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

Nachdem der Cloud Scheduler-Job erstellt wurde, können Sie den folgenden Befehl ausführen, um ihn sofort zu Testzwecken auszuführen:

gcloud scheduler jobs run $CLOUD_SCHEDULER --location=$REGION

HINWEIS:

Es kann einige Minuten dauern, bis die Jobausführung abgeschlossen ist. Sie können den Status auf der Seite „Cloud Run Scheduler“ verfolgen.

Prüfen Sie mit den folgenden Befehlen, ob der Cloud Run-Job erfolgreich ausgeführt wurde:

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

Die Ausgabe sollte in etwa so aussehen:

✔ Execution sample-job-w6hrj in region us-central1
1 task completed successfully
Elapsed time: 28 seconds

7. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs!

Behandelte Themen

  • Cloud Run-Job nach Zeitplan innerhalb eines VPC SC-Perimeters ausführen
  • Cloud Run-Dienst erstellen, der mithilfe der Cloud Run-Clientbibliotheken einen Cloud Run-Job auslöst
  • Cloud Scheduler so konfigurieren, dass ein Cloud Run-Dienst nach Zeitplan aufgerufen wird

8. Bereinigen

Wenn Sie versehentliche Kosten vermeiden möchten, z. B. wenn die Cloud Run-Dienste versehentlich häufiger aufgerufen werden als Ihre monatliche Cloud Run-Aufrufzuweisung im kostenlosen Tarif, können Sie entweder die GCP-Dienste oder das in Schritt 2 erstellte Projekt löschen.

Wenn Sie den Cloud Run-Dienst und den Cloud Run-Job löschen möchten, rufen Sie die Cloud Run-Cloud Console unter https://console.cloud.google.com/run auf und löschen Sie den Dienst.

Wenn Sie das gesamte Projekt löschen möchten, rufen Sie https://console.cloud.google.com/cloud-resource-manager auf, wählen Sie das in Schritt 2 erstellte Projekt aus und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie die Projekte in Ihrem Cloud SDK ändern. Sie können eine Liste aller verfügbaren Projekte aufrufen, indem Sie gcloud projects list ausführen.