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 SC VPC, 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 de VPC SC, vous devez mettre en proxy 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 illustrant le déclenchement d'un service Cloud Run par Cloud Scheduler pour exécuter un job Cloud Run

Points abordés

  • Exécuter un job Cloud Run selon une programmation dans un périmètre VPC Service Controls
  • 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 la procédure 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 la tâche 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 tâche 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 d'emplois Cloud Run dans un Artifact Registry de votre projet VPC configuré avec SC. Pour ce faire, vous pouvez utiliser l'outil gcrane en suivant les 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

Deuxièmement, déployez votre tâche 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 en savoir plus sur la création de tâches, veuillez suivre les étapes décrites dans la documentation sur les tâches Cloud Run.

4. Créer un compte de service

Cloud Run utilisera ce compte de service pour appeler la tâche 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 au compte de service les rôles "Demandeur Cloud Run" et "Lecteur 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. Créer le service Cloud Run

À cette étape, vous allez déployer un service Cloud Run qui sert 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, créez le conteneur à l'aide des commandes Docker suivantes. Notez que la configuration des déploiements basés sur la source peut s'avérer difficile dans un environnement de SC VPC. Si vous disposez d'un pipeline de compilation et de déploiement existant, utilisez-le pour compiler le code source dans un conteneur et le déployer 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 la commande suivante:

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

6. Créer une tâche 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 la tâche Cloud Scheduler créée, 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 de la tâche soit terminée. Vous pouvez suivre son état sur la page Cloud Run Scheduler (Planificateur Cloud Run).

Vérifiez que le job Cloud Run s'est bien exécuté 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 !

Félicitations ! 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 Service Controls
  • 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 appelés par inadvertance plus de fois que votre allocation mensuelle d'appels 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 Cloud Run et la tâche Cloud Run, accédez à la console Cloud Run à l'adresse https://console.cloud.google.com/run et supprimez le service.

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