Déployer l'agent sur Cloud Run
Où faire tourner un agent ?
| Option | Ce que vous gérez | Bon pour |
|---|---|---|
| Cloud Run | un conteneur ; Google gère serveurs et mise à l'échelle | API d'agent, webhooks (WhatsApp, chat), contrôle total |
| Vertex AI Agent Engine | le code de l'agent ; sessions, mémoire et mise à l'échelle sont gérées | aller vite sur un agent ADK, avec services managés |
| Gemini Enterprise | rien côté infra : l'agent est proposé aux employés dans l'interface | assistant interne, après déploiement sur l'une des options ci-dessus |
Nous prenons Cloud Run : c'est le plus transparent, et le même conteneur peut recevoir les webhooks d'une messagerie, à la manière d'un agent de commande sur WhatsApp comme Watpilot.
flowchart LR CL["Client (app, webhook messagerie)"] -->|"HTTPS + jeton IAM"| CR["Cloud Run : serveur API ADK"] CR --> GM["Gemini sur Vertex AI"] CR --> SM["Secret Manager"] CR --> DB["Base de sessions (ex. Cloud SQL)"] CR --> TR["Cloud Trace et Cloud Logging"]
Le chemin le plus court : adk deploy cloud_run
ADK sait construire le conteneur et le déployer pour vous :
export PROJECT_ID="mon-projet"
export REGION="europe-west1"
gcloud services enable run.googleapis.com aiplatform.googleapis.com \
cloudbuild.googleapis.com artifactregistry.googleapis.com --project "$PROJECT_ID"
adk deploy cloud_run \
--project "$PROJECT_ID" \
--region "$REGION" \
--service_name assistant-commandes \
--trace_to_cloud \
./assistant_commandes \
-- --no-allow-unauthenticatedLes options après -- sont transmises telles quelles à gcloud run deploy : ici, on interdit les appels anonymes.
Appeler l'agent déployé
Le serveur API d'ADK expose notamment /apps/{app}/users/{user}/sessions/{session} pour créer une session et /run pour envoyer un message :
URL=$(gcloud run services describe assistant-commandes --region "$REGION" --format 'value(status.url)')
TOKEN=$(gcloud auth print-identity-token)
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
"$URL/apps/assistant_commandes/users/u1/sessions/s1"
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
"$URL/run" -d '{
"app_name": "assistant_commandes", "user_id": "u1", "session_id": "s1",
"new_message": {"role": "user", "parts": [{"text": "Il vous reste du café ?"}]}
}'Votre agent est déployé avec le service de sessions en mémoire et Cloud Run démarre une deuxième instance sous la charge. Que constate un client ?
Chaque instance a sa propre mémoire. Une session créée sur l'instance A n'existe pas sur l'instance B. Il faut un service de sessions partagé (base de données ou Vertex AI) dès qu'il peut y avoir plus d'une instance, ou limiter à une instance en phase de test.
Avant d'ouvrir aux clients
| Point | Pourquoi | Comment |
|---|---|---|
| Sessions persistantes | conversations cohérentes entre instances et redémarrages | --session_service_uri vers une base ou Vertex AI |
| Accès privé | personne n'appelle votre agent (ni ne consomme votre budget) sans autorisation | --no-allow-unauthenticated + IAM, ou une passerelle |
| Compte de service dédié | moindre privilège | un compte avec seulement les rôles nécessaires (ex. utilisateur Vertex AI) |
| Plafonds | éviter l'emballement des coûts | max_llm_calls, --max-instances, alertes budgétaires |
| Traces | déboguer en production | --trace_to_cloud, journaux structurés |
| Jeu de tests | ne pas casser ce qui marchait | adk eval ou vos propres cas, à relancer avant chaque déploiement |
Quelles mesures réduisent le risque qu'un agent déployé coûte beaucoup plus que prévu ? (plusieurs réponses)
Limiter les appels par requête, les instances et être alerté sur le budget bornent le coût. Un service public permet à n'importe qui de l'appeler, ce qui augmente le risque au lieu de le réduire.
Exercice : préparer la mise en production
Écrivez la commande adk deploy cloud_run complète pour un déploiement de production : service privé, traces, au plus 3 instances, sessions stockées dans une base PostgreSQL dont l'URL est fournie par la variable SESSION_DB_URL, et Gemini via Vertex AI. Puis listez les deux vérifications à faire juste après.
Voir la solution
adk deploy cloud_run \
--project "$PROJECT_ID" \
--region "$REGION" \
--service_name assistant-commandes \
--trace_to_cloud \
--session_service_uri "$SESSION_DB_URL" \
./assistant_commandes \
-- --no-allow-unauthenticated --max-instances=3 \
--service-account="agent-commandes@${PROJECT_ID}.iam.gserviceaccount.com"Avec, dans assistant_commandes/.env (ou en variables du service) : GOOGLE_GENAI_USE_VERTEXAI=TRUE, GOOGLE_CLOUD_PROJECT et GOOGLE_CLOUD_LOCATION, sans clé d'API.
Vérifications juste après :
- Un appel sans jeton échoue (
curl "$URL/list-apps"doit renvoyer 401 ou 403), et le même appel avec jeton réussit. - Une conversation en deux messages garde le contexte, et sa trace apparaît dans Cloud Trace avec les appels d'outils.
Remarque : l'URL de la base contient un mot de passe. Pour un vrai projet, préférez une connexion sans mot de passe (authentification IAM) ou un secret monté ; la formation Terraform citée en tête de leçon montre comment câbler tout cela proprement.
Je sais faire
- Choisir entre Cloud Run, Agent Engine et Gemini Enterprise pour un cas donné
- Déployer un agent ADK avec
adk deploy cloud_runen service privé - Appeler l'agent déployé avec un jeton d'identité
- Vérifier sessions persistantes, plafonds et traces avant l'ouverture aux clients