1. Einführung
Übersicht
Wenn sich Ihr GCP-Projekt innerhalb eines VPC SC-Perimeters befindet, müssen Sie zusätzliche Schritte ausführen, um geplante Jobs einzurichten. Da Cloud Scheduler Jobs nicht direkt innerhalb von VPC SC-Perimetern 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:

Lerninhalte
- Cloud Run-Job nach Zeitplan innerhalb eines VPC SC-Perimeters ausführen
- Einen Cloud Run-Dienst erstellen, der einen Cloud Run-Job mit den Cloud Run-Clientbibliotheken 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 zum Einrichten 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 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
Stellen Sie als Nächstes 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 verwendet, um den Cloud Run-Job aufzurufen.
Erstellen Sie zuerst das Dienstkonto mit diesem Befehl:
gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Cloud Run to run a Cloud Run job"
Zweitens weisen Sie dem Dienstkonto die Rolle „Cloud Run-Aufrufer“ und die Rolle „Cloud Run-Betrachter“ zu.
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 fungiert.
mkdir job-runner-service && cd $_
Erstellen Sie eine Datei mit dem Namen main.py und mit folgendem Code als Inhalt.
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 ein 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 als Nächstes den Container mit den folgenden Docker-Befehlen. Hinweis: Die Einrichtung von quellbasierten Bereitstellungen in einer VPC SC-Umgebung kann schwierig sein. Wenn Sie bereits eine Pipeline zum Erstellen und Bereitstellen haben, verwenden Sie sie, 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-konform ist.
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 diesem Befehl:
SERVICE_URL=$(gcloud run services describe $CLOUD_RUN_SERVICE --region $REGION --format 'value(status.url)')
6. Cloud Scheduler-Job erstellen, um den Dienst auszulösen
# 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 den Cloud Scheduler-Job zu Testzwecken sofort auszuführen:
gcloud scheduler jobs run $CLOUD_SCHEDULER --location=$REGION
HINWEIS:
Es kann einige Minuten dauern, bis die Ausführung des Jobs abgeschlossen ist. Sie können den Status auf der Cloud Run Scheduler-Seite 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
- Einen Cloud Run-Dienst erstellen, der einen Cloud Run-Job mit den Cloud Run-Clientbibliotheken auslöst
- Cloud Scheduler so konfigurieren, dass ein Cloud Run-Dienst nach Zeitplan aufgerufen wird
8. Bereinigen
Um unbeabsichtigte Gebühren zu vermeiden, z. B. wenn die Cloud Run-Dienste versehentlich öfter aufgerufen werden, als in Ihrem monatlichen Cloud Run-Aufrufkontingent im kostenlosen Kontingent enthalten ist, 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 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 Projekt aus, das Sie in Schritt 2 erstellt haben, und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie das Projekt in Ihrem Cloud SDK ändern. Sie können die Liste aller verfügbaren Projekte mit gcloud projects list aufrufen.