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

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:

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

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.