Cloud Run
1 - Présentation
Cloud Run est une plateforme serverless pour exécuter des conteneurs sans gérer l'infrastructure.
2 - Services vs Jobs
| Type | Description | Usage |
|---|---|---|
| Service | Conteneur HTTP long-running | APIs, Web apps |
| Job | Conteneur batch one-shot | Tâches planifiées, migrations |
3 - Déployer un service
3.1 Depuis une image
# Déployer
gcloud run deploy my-service \
--image=europe-west1-docker.pkg.dev/mon-projet/images/my-app:v1.0.0 \
--region=europe-west1 \
--platform=managed \
--allow-unauthenticated \
--port=8080 \
--cpu=1 \
--memory=512Mi \
--min-instances=0 \
--max-instances=10
3.2 Depuis le code source
# Build et deploy automatique
gcloud run deploy my-service \
--source=. \
--region=europe-west1
3.3 Via Cloud Build
# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '-t'
- 'europe-west1-docker.pkg.dev/$PROJECT_ID/images/my-app:$COMMIT_SHA'
- '.'
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'europe-west1-docker.pkg.dev/$PROJECT_ID/images/my-app:$COMMIT_SHA']
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'gcloud'
args:
- 'run'
- 'deploy'
- 'my-service'
- '--image=europe-west1-docker.pkg.dev/$PROJECT_ID/images/my-app:$COMMIT_SHA'
- '--region=europe-west1'
- '--platform=managed'
4 - Configuration
4.1 Resources
gcloud run services update my-service \
--cpu=2 \
--memory=1Gi \
--concurrency=80 \
--timeout=300 \
--region=europe-west1
4.2 Scaling
# Min et max instances
gcloud run services update my-service \
--min-instances=1 \
--max-instances=100 \
--region=europe-west1
4.3 Variables d'environnement
gcloud run services update my-service \
--set-env-vars="NODE_ENV=production,LOG_LEVEL=info" \
--region=europe-west1
4.4 Secrets
# Utiliser un secret de Secret Manager
gcloud run services update my-service \
--set-secrets="API_KEY=api-key:latest" \
--region=europe-west1
# Monter comme fichier
gcloud run services update my-service \
--set-secrets="/secrets/config=config-secret:latest" \
--region=europe-west1
5 - Traffic Management
5.1 Canary deployment
# Déployer sans traffic
gcloud run deploy my-service \
--image=new-image:v2 \
--no-traffic \
--region=europe-west1
# Envoyer 10% du traffic
gcloud run services update-traffic my-service \
--to-revisions=my-service-00002=10 \
--region=europe-west1
# Promouvoir à 100%
gcloud run services update-traffic my-service \
--to-latest \
--region=europe-west1
5.2 Tags de révision
# Tagger une révision
gcloud run services update-traffic my-service \
--to-tags=canary=my-service-00002 \
--region=europe-west1
# URL: https://canary---my-service-xxxxx.run.app
6 - Jobs
6.1 Créer un job
gcloud run jobs create my-job \
--image=europe-west1-docker.pkg.dev/mon-projet/images/batch:v1 \
--region=europe-west1 \
--tasks=10 \
--parallelism=5 \
--task-timeout=3600 \
--max-retries=3
6.2 Exécuter un job
# Exécution manuelle
gcloud run jobs execute my-job --region=europe-west1
# Exécution planifiée (Cloud Scheduler)
gcloud scheduler jobs create http my-scheduled-job \
--schedule="0 2 * * *" \
--uri="https://europe-west1-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/mon-projet/jobs/my-job:run" \
--http-method=POST \
--oauth-service-account-email=scheduler-sa@mon-projet.iam.gserviceaccount.com
7 - Domaines personnalisés
7.1 Mapper un domaine
# Vérifier le domaine
gcloud domains verify example.com
# Mapper
gcloud run domain-mappings create \
--service=my-service \
--domain=app.example.com \
--region=europe-west1
7.2 Certificat SSL
Cloud Run fournit automatiquement un certificat SSL managé pour les domaines personnalisés.
8 - Authentification
8.1 Accès public
gcloud run services update my-service \
--allow-unauthenticated \
--region=europe-west1
8.2 Accès authentifié
# Restreindre l'accès
gcloud run services update my-service \
--no-allow-unauthenticated \
--region=europe-west1
# Donner accès à un utilisateur
gcloud run services add-iam-policy-binding my-service \
--member="user:[email protected]" \
--role="roles/run.invoker" \
--region=europe-west1
# Donner accès à un service account
gcloud run services add-iam-policy-binding my-service \
--member="serviceAccount:[email protected]" \
--role="roles/run.invoker" \
--region=europe-west1