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 :

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.