Planifier un job Cloud Run dans un périmètre VPC Service Controls

1. Introduction

Présentation

Si votre projet GCP se trouve dans un périmètre VPC-SC, vous devrez suivre des étapes supplémentaires pour configurer des jobs planifiés. Étant donné que Cloud Scheduler ne peut pas déclencher directement des jobs dans les périmètres VPC-SC, vous devrez transférer la requête via un autre composant. Nous vous recommandons d'utiliser un service Cloud Run comme proxy.

Voici à quoi ressemble l'architecture :

Schéma de Cloud Scheduler déclenchant un service Cloud Run qui exécute un job Cloud Run

Points abordés

  • Exécuter un job Cloud Run selon une programmation dans un périmètre VPC-SC
  • Créer un service Cloud Run qui déclenche un job Cloud Run à l'aide des bibliothèques clientes Cloud Run
  • Configurer Cloud Scheduler pour appeler un service Cloud Run de manière planifiée

2. Avant de commencer

Tout d'abord, assurez-vous d'avoir suivi les étapes de configuration de Cloud Run pour VPC Service Controls.

Ensuite, définissez les variables d'environnement qui seront utilisées tout au long de cet atelier de programmation.

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. Créer le job Cloud Run

Cet atelier de programmation utilise l'exemple de conteneur de jobs Cloud Run.

Commencez par créer un dépôt Artifact Registry pour le conteneur de votre job Cloud Run.

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

Ensuite, copiez l'exemple de conteneur de jobs Cloud Run dans un dépôt Artifact Registry de votre projet configuré avec VPC-SC. Pour ce faire, vous pouvez utiliser l'outil gcrane en suivant ces instructions d'installation. Pour en savoir plus sur gcrane, consultez la documentation sur la copie d'images entre des dépôts.

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

Ensuite, déployez votre job Cloud Run conforme à VPC Service Controls.

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

Pour savoir comment créer des jobs, suivez les étapes décrites dans la documentation Cloud Run Jobs.

4. Créer un compte de service

Ce compte de service sera utilisé par Cloud Run pour appeler le job Cloud Run.

Commencez par créer le compte de service en exécutant cette commande :

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

Ensuite, attribuez les rôles "Demandeur Cloud Run" et "Lecteur Cloud Run" au compte de service.

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. Créer le service Cloud Run

Dans cette étape, vous allez déployer un service Cloud Run qui fait office de proxy.

mkdir job-runner-service && cd $_

Créez un fichier nommé main.py avec le code suivant.

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

Créez un fichier nommé requirements.txt avec le code suivant.

google-cloud-run
flask

Enfin, créez un 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"]

Ensuite, compilez le conteneur à l'aide des commandes Docker suivantes. Notez qu'il peut être difficile de configurer des déploiements basés sur la source dans un environnement VPC-SC. Si vous disposez déjà d'un pipeline de compilation et de déploiement, utilisez-le pour compiler le code source dans un conteneur et déployer le conteneur en tant que service 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

Déployez maintenant votre service Cloud Run conforme à VPC Service Controls.

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

Enregistrez l'URL du point de terminaison du service en exécutant cette commande :

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

6. Créer un job Cloud Scheduler pour déclencher le service

# 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

Une fois le job Cloud Scheduler créé, vous pouvez exécuter la commande suivante pour l'exécuter immédiatement à des fins de test :

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

REMARQUE :

Vous devrez peut-être patienter quelques minutes pour que l'exécution du job se termine. Vous pouvez suivre son état sur la page Cloud Run Scheduler.

Vérifiez que le job Cloud Run s'est exécuté correctement en exécutant les commandes suivantes :

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

Le résultat doit ressembler à ceci :

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

7. Félicitations !

Bravo ! Vous avez terminé cet atelier de programmation.

Points abordés

  • Exécuter un job Cloud Run selon une programmation dans un périmètre VPC-SC
  • Créer un service Cloud Run qui déclenche un job Cloud Run à l'aide des bibliothèques clientes Cloud Run
  • Configurer Cloud Scheduler pour appeler un service Cloud Run de manière planifiée

8. Effectuer un nettoyage

Pour éviter des frais involontaires (par exemple, si les services Cloud Run sont invoqués par inadvertance plus de fois que votre quota mensuel d'invocations Cloud Run dans le niveau sans frais), vous pouvez supprimer les services GCP ou le projet que vous avez créé à l'étape 2.

Pour supprimer le service et le job Cloud Run, accédez à la console Cloud Run à l'adresse https://console.cloud.google.com/run, puis supprimez le service.

Si vous choisissez de supprimer l'intégralité du projet, vous pouvez accéder à https://console.cloud.google.com/cloud-resource-manager, sélectionner le projet que vous avez créé à l'étape 2, puis choisir "Supprimer". Si vous supprimez le projet, vous devrez changer de projet dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.