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 :
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
.