درس 4 — Déployer et exploiter

Déployer et appeler avec un jeton

5 دقائق قراءة

هذا المحتوى غير مترجم بعد. تُعرض النسخة الأصلية.

Déployer et appeler avec un jeton

Ce que fait adk deploy cloud_run

flowchart LR
  A["adk deploy cloud_run files/"] --> B["génère un Dockerfile (adk api_server)"]
  B --> C["gcloud run deploy --source"]
  C --> D["Cloud Build construit l'image"]
  D --> E["Artifact Registry : cloud-run-source-deploy"]
  E --> F["Cloud Run : nouvelle révision"]

La commande génère un Dockerfile qui installe google-adk (même version que votre poste, ici 2.10.0) et vos requirements.txt, puis lance adk api_server. Tout ce qui suit -- est passé tel quel à gcloud run deploy. Vérifiez les options de votre version avec adk deploy cloud_run --help.

files/deployer.sh (extrait)
adk deploy cloud_run \
  --project "$PROJECT_ID" --region "$REGION" \
  --service_name "$SERVICE" --app_name assistant_interne \
  --env GOOGLE_GENAI_USE_VERTEXAI=TRUE --env MODEL="${MODEL:-gemini-2.5-flash}" \
  . \
  -- --no-allow-unauthenticated --service-account "$SA" \
     --max-instances 1 --memory 1Gi --labels "formation-lab=${SLUG}"
OptionRôle
--app_name assistant_internenom de l'application dans l'API ADK (sinon : nom du dossier, ici files)
--env GOOGLE_GENAI_USE_VERTEXAI=TRUEGemini via Vertex AI, donc via l'identité du service, sans clé ; ADK ajoute lui-même GOOGLE_CLOUD_PROJECT et GOOGLE_CLOUD_LOCATION
--no-allow-unauthenticatedservice privé : IAM obligatoire
--service-accountle compte dédié de la leçon précédente
--max-instances 1plafond de coût et de charge pour un lab
--labels formation-lab=...retrouver et facturer par lab ; ADK ajoute created-by=adk

Lancez le tout :

terminal
cd files
export PROJECT_ID="mon-projet-gcp"
./deployer.sh

Vous oubliez --app_name dans la commande. Quel chemin devez-vous utiliser dans l'URL de l'API ?

Prouver que le service est privé

terminal
URL=$(gcloud run services describe lab-agent-cloud-run-iam --region europe-west1 \
      --project "$PROJECT_ID" --format 'value(status.url)')
curl -s -o /dev/null -w "sans jeton : HTTP %{http_code}\n" -X POST "$URL/run"
curl -s -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$URL/list-apps"

gcloud auth print-identity-token fournit un jeton d'identité de votre compte, valable environ une heure. Cloud Run l'accepte si vous avez roles/run.invoker sur le service (inclus dans Propriétaire).

Appeler l'agent

L'API ADK attend deux requêtes : créer une session, puis POST /run avec le message. Le client les enchaîne et extrait les outils appelés et la réponse finale :

files/client.py
with httpx.Client(base_url=url, headers={"Authorization": f"Bearer {jeton}"}, timeout=120) as http:
    http.post(f"/apps/{APP_NAME}/users/{user}/sessions/{session}", json={}).raise_for_status()
    r = http.post("/run", json={
        "app_name": APP_NAME, "user_id": user, "session_id": session,
        "new_message": {"role": "user", "parts": [{"text": question}]},
    })
for ev in r.json():   # liste des événements : appels d'outils, réponses d'outils, texte
    ...
terminal
export SERVICE_URL="$URL" ID_TOKEN=$(gcloud auth print-identity-token)
python client.py "Combien de jours de télétravail par semaine ai-je droit ?"
python client.py "Mon VPN refuse de se connecter depuis ce matin, j'ai déjà redémarré."

Une appli interne tourne elle-même sur Cloud Run et doit appeler l'assistant. Comment obtient-elle un jeton d'identité ?

Résultat obtenu

Sorties réelles du 2026-10-15 (identifiants masqués) :

deployer.sh (2026-10-15)
Reading ignore patterns from .gcloudignore...
Creating Dockerfile complete: /tmp/deploy_src/20261015_163218/Dockerfile
Building using Dockerfile and deploying container to Cloud Run service [lab-agent-cloud-run-iam] in project [mon-projet-gcp] region [europe-west1]
Creating Container Repository....done
Building Container....done
Creating Revision....done
Routing traffic.....done
Service [lab-agent-cloud-run-iam] revision [lab-agent-cloud-run-iam-00001-sd6] has been deployed and is serving 100 percent of traffic.
Service URL: https://lab-agent-cloud-run-iam-123456789012.europe-west1.run.app
client.py (2026-10-15)
sans jeton : HTTP 403
["assistant_interne"]
OUTILS  : chercher_politique
REPONSE : La politique de télétravail de l'entreprise indique que vous avez droit à jusqu'à 2 jours de télétravail par semaine. Vous devez en informer votre responsable le lundi.
OUTILS  : ouvrir_ticket
REPONSE : J'ai ouvert un ticket "TCK-0001" auprès du support informatique pour votre problème de VPN. Ils vous contacteront bientôt.

Le déploiement complet a pris quelques minutes (essentiellement la construction de l'image).

Exercice

Donnez l'accès à l'assistant à une seule personne, alice@exemple.com, sans lui donner aucun autre droit sur le projet, puis expliquez comment elle l'appelle.

Voir la solution

Le rôle d'invocation, sur ce service uniquement :

gcloud run services add-iam-policy-binding lab-agent-cloud-run-iam \
  --region europe-west1 --project "$PROJECT_ID" \
  --member "user:alice@exemple.com" --role roles/run.invoker

Alice se connecte avec gcloud auth login, puis :

export SERVICE_URL="https://lab-agent-cloud-run-iam-....run.app"
export ID_TOKEN=$(gcloud auth print-identity-token)
python client.py "Comment poser mes congés ?"

Ou plus simplement gcloud run services proxy lab-agent-cloud-run-iam --region europe-west1, qui ouvre un tunnel local authentifié sur http://localhost:8080.

Je sais faire

  • Déployer un agent ADK avec adk deploy cloud_run et des options gcloud après --
  • Prouver qu'un service est privé (403 sans jeton, 200 avec)
  • Appeler l'API ADK (/apps/.../sessions/... puis /run) avec un jeton d'identité
  • Donner l'accès à une personne sur un seul service
التالي