Configuration opérationnelle
- Leçon 14
- 45 min
- Module 5 : Déployer et nettoyer
Leçon 14 sur 15 · L'essentiel de Docker et du nuage pour les développeurs en IAConfiguration opérationnelle
1. Comprendre les conteneurs
2. Construire l'image de l'application
3. Réseau, configuration et persistance
4. Les services de base du nuage
5. Déployer et nettoyer
Ce que vous saurez faire
Une plateforme gérée exécute votre conteneur, mais elle ne connaît pas votre application. Indiquez-lui comment vérifier l’application, sa taille maximale, ses limites de croissance et ses paramètres requis. Ainsi, une mauvaise version s’arrête avant d’atteindre qui que ce soit.
Avant de commencerCe qu’il faut savoir et avoir sous la main
Ce que vous devez savoir
- La vitalité et la disponibilité,
/healthet/ready, dans Publier en toute sécurité : vitalité et disponibilité du cours Créer et déployer votre première API. REQUIRE_API_KEYet les lignesSettings error(erreur de paramètres), dans Configuration à l’exécution : paramètres obligatoires et facultatifs et Un fichier de paramètres.- Pourquoi
/readyéchoue quand la base de données est hors service, dans Données persistantes : À vous de jouer : la base de données s’arrête. - La mise à l’échelle à zéro et les requêtes que vous n’avez pas envoyées, dans Connaître les coûts : passage à zéro et requêtes que vous n’avez pas envoyées.
Ce qu’il vous faut sur votre ordinateur
- Parcours réel : l’application conteneurisée
ticket-apidansrg-ticket-api-practice, le nom de son registre et sa clé dans votre terminal, depuis Registre et déploiement : l’option réelle : créer le déploiement. Si vous avez fermé le terminal, définissez de nouveauRGetACR, comme dans cette section. - Parcours simulé : la simulation locale en cours d’exécution, depuis Registre et déploiement : le parcours simulé : les mêmes étapes sur votre ordinateur. Il vous faut aussi le registre local avec
ticket-api:1.1.0pourlinux/amd64, depuis Registre et déploiement : construire pour le processeur du nuage. deploy/containerapp.yamldans le projet. S’il manque, copiez-le depuis l’instantanéend-of-m05.
Testé avec Docker Desktop 4.81.0 (Docker Engine 29.6.1) sur macOS, avec une puce Apple. Les étapes Azure ont été exécutées avec Azure CLI 2.88.0 et l’extension containerapp 1.3.0b5, dans la région canadacentral. Les étapes Windows et Linux ne sont pas testées.
Ce que la plateforme sait maintenant
Section intitulée « Ce que la plateforme sait maintenant »Après Registre et déploiement, Amira demande à Azure comment il vérifie son application :
az containerapp show -g $RG -n ticket-api --query "properties.template.containers[0].probes" -o jsonLa réponse (réelle) est une liste vide. Sans sondes, la plateforme vérifie seulement que quelque chose accepte les connexions sur le port 8000 (une vérification TCP). Un processus bloqué ou un classificateur incapable de classifier réussit quand même cette vérification.
« Sans serveur » ne veut pas dire « sans configuration ». La plateforme gère les serveurs. Elle ignore ce que signifie « fonctionner » pour votre application, ses besoins en mémoire et ses paramètres requis. Vous le lui indiquez en cinq parties :
| Partie | Question à laquelle elle répond | Réponse de l’API de billets |
|---|---|---|
| Entrée | Qui peut accéder à l’application, et sur quel port? | Externe, HTTPS, port cible 8000 |
| Sondes | Comment la plateforme sait-elle que l’application fonctionne? | /health pour le démarrage et la vitalité, /ready pour la disponibilité |
| Ressources | Quelle est la taille d’une réplique? | 0,25 vCPU, 0,5 Gio |
| Mise à l’échelle | Combien de répliques, au minimum et au maximum? | De 0 à 2 |
| Paramètres requis | Quels paramètres doivent être définis pour que l’application démarre? | API_KEY depuis le secret, REQUIRE_API_KEY=true, SHOW_DOCS=false |
Entrée : un seul point d’accès
Section intitulée « Entrée : un seul point d’accès »L’entrée est la porte d’entrée de la plateforme : elle reçoit les requêtes externes et les transmet à votre conteneur. --ingress external --target-port 8000, dans la leçon précédente, l’a configurée. Azure donne à l’application une adresse HTTPS avec un certificat. Il transmet chaque requête au port 8000 d’un conteneur. L’application elle-même utilise HTTP sans chiffrement, comme sur votre ordinateur.
La plateforme ne sert pas les requêtes en http:// sans chiffrement. Amira le vérifie (parcours réel) :
curl -s -o /dev/null -w "%{http_code} -> %{redirect_url}\n" http://ticket-api.nicewater-a307f95a.canadacentral.azurecontainerapps.io/health301 -> https://ticket-api.nicewater-a307f95a.canadacentral.azurecontainerapps.io/health301 indique une redirection permanente vers l’adresse HTTPS. Une clé envoyée par HTTP sans chiffrement pourrait être lue en chemin. La plateforme ne répond donc jamais à cette adresse.
Trois sondes, deux points de terminaison
Section intitulée « Trois sondes, deux points de terminaison »Une sonde est une requête que la plateforme envoie régulièrement à l’application pour décider quoi faire d’une réplique. Container Apps en propose trois types :
| Sonde | Question | En cas d’échec | L’API de billets |
|---|---|---|---|
| Démarrage | L’application a-t-elle fini de démarrer? | Attendre. Après trop d’échecs, redémarrer la réplique. | /health, toutes les 2 s, jusqu’à 30 fois |
| Vitalité | Le processus fonctionne-t-il encore? | Redémarrer la réplique. | /health, toutes les 10 s, 3 échecs |
| Disponibilité | Peut-elle faire son travail maintenant? | Ne lui envoyer aucune requête, sans la redémarrer. | /ready, toutes les 10 s, 3 échecs |
Pourquoi utiliser /ready seulement pour la disponibilité? Rappelez-vous le module 3 : quand la base de données est hors service, /ready renvoie 503, et la classification fonctionne encore. Un redémarrage ne peut pas réparer une base de données. Si la vitalité utilisait /ready, une panne de base de données ferait redémarrer l’application sans cesse et arrêterait aussi la classification. La vitalité demande donc « le processus est-il actif? » (/health), et la disponibilité demande « peut-il travailler maintenant? » (/ready).
La sonde de démarrage protège un démarrage lent. Elle accorde jusqu’à 30 × 2 s = 60 s. Les vérifications de vitalité commencent seulement quand la sonde de démarrage réussit. Un démarrage lent n’est donc pas considéré comme un processus arrêté.
Les paramètres dans un seul fichier
Section intitulée « Les paramètres dans un seul fichier »Amira ne configure pas les sondes avec de nombreuses options. Elle conserve tous les paramètres opérationnels dans deploy/containerapp.yaml et les révise dans Git comme du code :
# The container settings of the ticket API on Azure Container Apps.# Apply with:# az containerapp update --resource-group rg-ticket-api-practice \# --name ticket-api --yaml deploy/containerapp.yaml# Replace REGISTRY_NAME with the name of your registry first.# The secret api-key must already exist on the app (az containerapp secret set).properties: template: containers: - name: ticket-api image: REGISTRY_NAME.azurecr.io/ticket-api:1.1.0 resources: cpu: 0.25 memory: 0.5Gi env: - name: API_KEY secretRef: api-key - name: REQUIRE_API_KEY value: "true" - name: SHOW_DOCS value: "false" probes: - type: Startup httpGet: path: /health port: 8000 initialDelaySeconds: 1 periodSeconds: 2 failureThreshold: 30 - type: Liveness httpGet: path: /health port: 8000 periodSeconds: 10 failureThreshold: 3 - type: Readiness httpGet: path: /ready port: 8000 periodSeconds: 10 failureThreshold: 3 scale: minReplicas: 0 maxReplicas: 2Le fichier ne contient aucun secret. secretRef: api-key désigne le secret de l’application, et sa valeur reste dans Azure. Vous pouvez enregistrer ce fichier dans un commit (enregistrement des modifications).
Ressources. Dans le plan Consumption, le processeur et la mémoire sont offerts en paires fixes. La plus petite paire est de 0,25 vCPU avec 0,5 Gio. L’API de billets utilisait environ 57 Mio dans la simulation. Avec 0,5 Gio, il reste donc de la marge.
Mise à l’échelle. Une réplique est une copie de l’application en cours d’exécution (voir Connaître les coûts). minReplicas: 0 permet la mise à l’échelle à zéro : aucune réplique et aucuns frais de calcul après 300 s sans appel. maxReplicas: 2 limite les coûts et les dommages. Si un programme envoie des milliers de requêtes, la plateforme démarre au maximum deux répliques, pas dix (le maximum par défaut est 10).
Paramètres requis. REQUIRE_API_KEY: "true" fait échouer le démarrage si la clé manque, au lieu de laisser une API ouverte. Si le secret manque, l’application s’arrête avec Settings error: REQUIRE_API_KEY is true, but API_KEY is not set (erreur de paramètres : REQUIRE_API_KEY est vrai, mais API_KEY n’est pas défini). La nouvelle révision ne devient jamais disponible, et l’ancienne continue de répondre. C’est un échec sûr.
Exemple détaillé : appliquer le fichier (parcours réel)
Section intitulée « Exemple détaillé : appliquer le fichier (parcours réel) »Amira inscrit le nom de son registre sur la ligne de l’image, puis applique le fichier :
sed -i '' "s/REGISTRY_NAME/$ACR/" deploy/containerapp.yamlaz containerapp update -g $RG -n ticket-api --yaml deploy/containerapp.yaml --query "{rev:properties.latestRevisionName, prov:properties.provisioningState}" -o table(Get-Content deploy/containerapp.yaml) -replace 'REGISTRY_NAME', $ACR | Set-Content deploy/containerapp.yamlaz containerapp update -g $RG -n ticket-api --yaml deploy/containerapp.yaml --query "{rev:properties.latestRevisionName, prov:properties.provisioningState}" -o tablesed -i "s/REGISTRY_NAME/$ACR/" deploy/containerapp.yamlaz containerapp update -g $RG -n ticket-api --yaml deploy/containerapp.yaml --query "{rev:properties.latestRevisionName, prov:properties.provisioningState}" -o tableLe nom du registre n’est pas un secret. Il peut donc figurer dans le fichier enregistré dans le commit. La sortie (réelle) :
Rev Prov------------------- ---------ticket-api--0000001 SucceededUne nouvelle révision, ticket-api--0000001. Une révision est une copie fixe de l’image et des paramètres de l’application. Chaque modification du modèle de configuration (image, paramètres, sondes) en crée une nouvelle. Amira vérifie qu’Azure possède bien ce qu’indique le fichier :
az containerapp show -g $RG -n ticket-api --query "properties.template.containers[0].{probes:probes[].type, env:env[].name}" -o json{ "env": ["API_KEY", "REQUIRE_API_KEY", "SHOW_DOCS"], "probes": ["Liveness", "Readiness", "Startup"]}Voici maintenant les révisions, juste après la mise à jour et 20 s plus tard :
az containerapp revision list -g $RG -n ticket-api --query "[].{name:name, active:properties.active, replicas:properties.replicas, health:properties.healthState, traffic:properties.trafficWeight}" -o tableName Active Replicas Health Traffic------------------- -------- ---------- -------- ---------ticket-api--nz14cir True 1 Healthy 0ticket-api--0000001 True 1 None 100
Name Active Replicas Health Traffic------------------- -------- ---------- -------- ---------ticket-api--nz14cir True 1 Healthy 0ticket-api--0000001 True 1 Healthy 100L’application est en mode de révision unique (az containerapp show … --query properties.configuration.activeRevisionsMode indique Single, soit unique). Une seule révision reçoit le trafic. La plateforme démarre la nouvelle à côté de l’ancienne, puis supprime l’ancienne quand la nouvelle est disponible. Le prochain échec de la leçon montre ce qui arrive quand elle ne devient jamais « disponible ».
Exemple détaillé : les mêmes idées dans la simulation
Section intitulée « Exemple détaillé : les mêmes idées dans la simulation »La simulation n’a ni sondes ni révisions, mais elle possède trois des cinq parties. Amira les examine dans le conteneur en cours d’exécution.
Une vérification de l’état de santé. Docker exécute la commande healthcheck (vérification de l’état de santé) dans le conteneur toutes les 10 s. Elle utilise urllib de Python, car l’image allégée ne contient pas curl :
docker inspect ticket-api-cloud-sim-api-1 --format "{{json .State.Health}}"{"Status":"healthy","FailingStreak":0,"Log":[{"Start":"2026-10-07T16:50:36.679051923Z","End":"2026-10-07T16:50:37.721244007Z","ExitCode":0,"Output":""}]}La vérification de Docker ressemble à une sonde de vitalité qui ne fait que signaler l’état. docker ps affiche (unhealthy) (en mauvais état), mais Docker ne redémarre pas le conteneur pour cette raison. Les vérifications apparaissent dans le journal de l’application comme des requêtes provenant de 127.0.0.1. Elles s’exécutent dans le conteneur, comme les sondes d’Azure.
Les limites de taille.
docker stats --no-stream ticket-api-cloud-sim-api-1CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS5567fda8c533 ticket-api-cloud-sim-api-1 2.14% 56.92MiB / 512MiB 11.12% 7.96kB / 6.1kB 0B / 0B 6/ 512MiB correspond à mem_limit: 512m. Si l’application utilisait plus de mémoire, le noyau l’arrêterait. cpus: 0.25 n’apparaît pas ici : docker inspect l’affiche sous NanoCpus avec 250000000, soit un quart de processeur.
Une politique de redémarrage et un paramètre requis. restart: on-failure redémarre le conteneur quand l’application s’arrête avec une erreur. Faites une prédiction : si Amira arrête proprement l’application de l’intérieur, Docker la redémarre-t-il?
docker exec ticket-api-cloud-sim-api-1 sh -c 'kill 1'docker ps -a --filter name=ticket-api-cloud-sim --format "{{.Names}} {{.Status}}"ticket-api-cloud-sim-api-1 Exited (0) 2 seconds agoNon. kill 1 envoie le signal d’arrêt au processus 1, l’application. Elle s’arrête proprement, avec le code de sortie 0, et on-failure redémarre seulement après une erreur. Maintenant, un véritable échec : Amira vide le fichier de clé. Le paramètre requis manque alors, et elle redémarre le service. Un secret Compose est monté depuis le fichier. Le conteneur voit donc la modification.
cp secrets/api_key.txt secrets/api_key.txt.bak: > secrets/api_key.txtdocker compose -f deploy/local-cloud.yaml up -ddocker compose -f deploy/local-cloud.yaml logs --tail 3 apidocker ps -a --filter name=ticket-api-cloud-sim --format "{{.Status}}"La sortie (simulée; docker ps exécuté quelques fois, à une seconde d’intervalle) :
api-1 |api-1 |api-1 | Settings error: REQUIRE_API_KEY is true, but API_KEY is not setRestarting (1) Less than a second agoUp Less than a second (health: starting)Up 2 seconds (health: starting)Restarting (1) Less than a second agoL’application s’arrête avec le code de sortie 1, et Docker la redémarre, encore et encore. docker inspect ticket-api-cloud-sim-api-1 --format "{{.RestartCount}}" compte les redémarrages. Lors de deux essais, le compte augmentait de un toutes les 4 à 10 s. Avec un quart de processeur, l’application met quelques secondes à atteindre la vérification des paramètres. L’API ne répond jamais sans clé : personne n’accède à une API ouverte. Amira remet la clé :
cp secrets/api_key.txt.bak secrets/api_key.txtrm secrets/api_key.txt.bakAu prochain redémarrage, l’application trouve la clé. Environ 25 s plus tard, docker ps affichait Up 34 seconds (healthy) (actif depuis 34 secondes, en bon état), sans commande d’Amira. C’est une version réduite de ce qu’Azure fait avec une révision incapable de démarrer. Il y a une différence : Docker n’a qu’un conteneur, donc l’API est hors service pendant les redémarrages. Azure garde l’ancienne révision en service.
Exercice guidé : donner ses instructions à la plateforme
Section intitulée « Exercice guidé : donner ses instructions à la plateforme »- Lisez
deploy/containerapp.yaml. Pour chaque sonde, notez dansdocs/cloud-design.mdson chemin et ce que la plateforme fait en cas d’échec. - Parcours réel : inscrivez le nom de votre registre dans le fichier, puis appliquez-le avec
az containerapp update --yaml. Résultat attendu : une nouvelle révision,ticket-api--0000001, etSucceeded(réussi). - Parcours réel : listez les révisions jusqu’à ce que la nouvelle soit
Healthy(en bon état), avec un trafic de100. - Parcours réel : vérifiez les sondes et les noms des paramètres avec
az containerapp show. Résultat attendu :Liveness(vitalité),Readiness(disponibilité),Startup(démarrage), etAPI_KEY,REQUIRE_API_KEY,SHOW_DOCS. - Parcours simulé : vérifiez l’état de santé avec
docker inspect … --format "{{json .State.Health}}". Résultat attendu :"Status":"healthy"(état : en bon état). - Parcours simulé : vérifiez la limite de mémoire avec
docker stats --no-stream. Résultat attendu :/ 512MiB. - Parcours simulé : videz le fichier de clé et observez les redémarrages, comme dans l’exemple détaillé. Remettez ensuite la clé et attendez
(healthy)(en bon état). - Les deux parcours : vérifiez que
/docsrenvoie404, carSHOW_DOCSvautfalse.
Afficher les notes attendues pour l’étape 1
| Sonde | Chemin | En cas d’échec |
|---|---|---|
| Démarrage | /health, toutes les 2 s |
La plateforme attend, jusqu’à 30 échecs (60 s). Ensuite, elle redémarre la réplique. Les sondes de vitalité et de disponibilité attendent sa réussite. |
| Vitalité | /health, toutes les 10 s |
Après 3 échecs, la plateforme redémarre la réplique. |
| Disponibilité | /ready, toutes les 10 s |
Après 3 échecs, la plateforme n’envoie aucune requête à la réplique, mais ne la redémarre pas. |
/ready n’est pas une vérification de vitalité. Elle échoue quand la base de données est hors service, et un redémarrage ne peut pas réparer une base de données.
À vous de jouer : docker kill et la politique de redémarrage
Section intitulée « À vous de jouer : docker kill et la politique de redémarrage »L’exemple détaillé a arrêté l’application de l’intérieur. Arrêtez-la maintenant de l’extérieur, avec docker kill ticket-api-cloud-sim-api-1. docker kill termine le processus immédiatement, et le code de sortie n’est pas 0.
Prédisez : est-ce que restart: on-failure redémarre le conteneur? Exécutez la commande, puis vérifiez avec docker ps -a. Ensuite, relancez la simulation avec docker compose -f deploy/local-cloud.yaml up -d.
Afficher la réponse
Non. La sortie (simulée) :
ticket-api-cloud-sim-api-1 Exited (137) 3 seconds agoLe code de sortie 137 signifie « terminé par le signal SIGKILL » (128 + 9). C’est un code d’échec, mais Docker ne redémarre pas le conteneur. Un arrêt que vous demandez avec docker stop ou docker kill est un arrêt manuel. Docker ne redémarre jamais un conteneur après un arrêt manuel. Une politique de redémarrage sert aux échecs que personne n’a demandés. Azure Container Apps fonctionne autrement : la plateforme redémarre toujours une réplique qui s’arrête. La sonde de vitalité peut aussi redémarrer une réplique qui fonctionne, mais ne répond pas.
Erreur courante
Le déploiement a réussi, mais la nouvelle version ne démarre jamais
Description textuelle du diagramme
En mode à révision unique, une nouvelle révision reçoit le trafic seulement lorsqu’elle est prête. L’image de la révision 0000002 ciblait le mauvais processeur. Son téléchargement échouait donc sans cesse, et elle restait à l’état Activating. Pendant tout ce temps, la révision 0000001 servait les requêtes. Quand Amira a déployé la bonne image, la révision 0000003 a démarré, est devenue prête et a reçu le trafic. La plateforme a ensuite supprimé 0000001.
Symptôme (en conditions réelles) : Amira a construit une image seulement pour linux/arm64, avec l’étiquette 1.1.0-arm64, puis l’a déployée. La commande a indiqué Succeeded (réussi) :
docker buildx build --platform linux/arm64 -t $ACR.azurecr.io/ticket-api:1.1.0-arm64 --push .az containerapp update -g $RG -n ticket-api --image $ACR.azurecr.io/ticket-api:1.1.0-arm64 --query "{rev:properties.latestRevisionName, prov:properties.provisioningState}" -o tableRev Prov------------------- ---------ticket-api--0000002 SucceededMais 60 secondes plus tard, la nouvelle révision ne fonctionnait toujours pas, et l’ancienne recevait le trafic :
Name Active Replicas Health Running Traffic------------------- -------- ---------- -------- ---------- ---------ticket-api--0000001 True 1 Healthy Running 0ticket-api--0000002 True 1 None Activating 100/health donnait toujours 200 : l’ancienne révision répondait. (La colonne Traffic (trafic) montre la cible, soit 100 pour la nouvelle révision. Les requêtes allaient toujours à l’ancienne, car la nouvelle n’était pas prête.)
Diagnostic : les journaux (logs) système. Utilisez --type system sans --format text (avec cette option, la commande indique ERROR: --type: only json logs supported for system logs (erreur : les journaux système prennent seulement en charge le format JSON)) :
az containerapp logs show -g $RG -n ticket-api --type system --tail 15La sortie (en conditions réelles; un objet JSON par ligne, présenté ici avec l’heure, Reason (raison) et Msg (message)) :
2026-10-07 16:18:24 PullingImage | Pulling image 'ticketapi4821.azurecr.io/ticket-api:1.1.0-arm64'2026-10-07 16:18:34 ImagePullUnauthorized | Pull image: ticketapi4821.azurecr.io/ticket-api:1.1.0-arm64 failed with unauthorized exception.2026-10-07 16:18:34 ContainerTerminated | Container 'ticket-api' was terminated with exit code '' and reason 'ImagePullFailure'2026-10-07 16:18:54 PullingImage | Pulling image 'ticketapi4821.azurecr.io/ticket-api:1.1.0-arm64'2026-10-07 16:19:03 ImagePullUnauthorized | Pull image: ticketapi4821.azurecr.io/ticket-api:1.1.0-arm64 failed with unauthorized exception.2026-10-07 16:19:03 ContainerTerminated | Container 'ticket-api' was terminated with exit code '' and reason 'ImagePullFailure'Cause : le message indique « unauthorized » (non autorisé), mais l’identité et son rôle étaient corrects. L’image portant l’étiquette 1.1.0, dans le même dépôt, se téléchargeait sans problème. L’image n’avait aucune variante linux/amd64. Azure a signalé la plateforme manquante comme un échec de téléchargement. Le parcours simulé montre la vraie cause, en mots clairs, avec la même image :
docker pull --platform linux/amd64 127.0.0.1:5000/ticket-api:1.1.0-arm64Error response from daemon: no matching manifest for linux/amd64 in the manifest list entries: no match for platform in manifest: not foundCorrection :
- Avant de déployer, vérifiez la plateforme :
docker buildx imagetools inspect $ACR.azurecr.io/ticket-api:<tag>doit afficherlinux/amd64. - Déployez de nouveau la dernière image fonctionnelle :
az containerapp update -g $RG -n ticket-api --image $ACR.azurecr.io/ticket-api:1.1.0 --query properties.latestRevisionName -o tsv. La commande a affichéticket-api--0000003. - Listez les révisions jusqu’à ce que la nouvelle affiche
Healthy(saine) avec un trafic de100. Après 45 secondes :
Name Active Replicas Health Running Traffic------------------- -------- ---------- -------- -------------- ---------ticket-api--0000001 True 1 Healthy Deprovisioning 0ticket-api--0000003 True 1 Healthy Running 100Pour un vrai service d’IA : « la commande a réussi » signifie seulement que la plateforme a accepté votre requête. Un serveur de modèle avec une grosse image échoue de la même façon. C’est aussi le cas si un fichier de modèle ne se charge pas : après la commande, pendant le démarrage. Vérifiez toujours l’état de santé de la révision et exécutez les tests de bon fonctionnement après un déploiement. Et si une erreur de téléchargement semble illogique, vérifiez d’abord la plateforme de l’image.
Vérifiez votre compréhension
Pourquoi l'API de billets utilise-t-elle /health pour la vitalité et /ready pour la disponibilité, plutôt que /ready pour les deux?
Afficher la réponse
L’échec d’une sonde de vitalité redémarre la réplique. L’échec d’une sonde de disponibilité arrête seulement les requêtes vers cette réplique. /ready échoue lorsqu’une dépendance, comme la base de données de l’historique, est en panne. Un redémarrage ne peut pas réparer la base de données. Avec /ready pour la vitalité, une panne de base de données ferait redémarrer l’application sans cesse. La classification, qui fonctionne encore, s’arrêterait aussi. /health échoue seulement quand le processus lui-même ne répond pas. Un redémarrage peut alors aider.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Vérifiez votre compréhension
Prédisez : vous déployez une nouvelle révision, mais vous avez oublié de créer le secret api-key. REQUIRE_API_KEY vaut true. Que voient les utilisateurs de l'API?
Afficher la réponse
Ils ne voient aucun changement : l’ancienne révision continue de servir les requêtes. La nouvelle révision ne peut pas démarrer sans clé. L’application s’arrête avec Settings error: REQUIRE_API_KEY is true, but API_KEY is not set (erreur de configuration : REQUIRE_API_KEY vaut true, mais API_KEY n’est pas défini). La sonde de démarrage ne réussit jamais, et la plateforme n’y transfère jamais le trafic. Sans REQUIRE_API_KEY=true, la nouvelle révision démarrerait sans clé, et l’API serait ouverte à tout le monde. Un paramètre obligatoire transforme une erreur dangereuse en déploiement échoué. (Le test avec un secret manquant n’a pas été effectué en conditions réelles. La simulation montre la même erreur de configuration et les redémarrages.)
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Vérifiez votre compréhension
La responsable du soutien dit : c'est sans serveur, donc ça ne coûte rien et ne nécessite aucun paramètre. Donnez deux paramètres de deploy/containerapp.yaml qui montrent pourquoi ces deux affirmations sont fausses.
Afficher la réponse
minReplicas: 0 est un paramètre. C’est lui qui rend le coût de calcul nul quand personne n’appelle l’API. Avec minReplicas: 1, une réplique fonctionne tout le mois et entraîne des frais. maxReplicas: 2 limite le coût quand beaucoup de requêtes arrivent : la valeur par défaut permet 10 répliques. Les sondes, la taille (cpu: 0.25, memory: 0.5Gi) et REQUIRE_API_KEY sont aussi des paramètres que la plateforme ne peut pas deviner. Sans serveur signifie que quelqu’un d’autre gère les serveurs. Vous décidez toujours des limites de coût, des vérifications et des paramètres obligatoires. Et le registre et les journaux entraînent des frais même quand l’application n’a aucune réplique.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Récapitulatif
- Le mode sans serveur nécessite quand même une configuration : accès entrant, sondes, ressources, limites de mise à l’échelle et paramètres obligatoires.
- L’accès entrant fournit une seule adresse HTTPS. Le HTTP non chiffré reçoit une redirection
301vers HTTPS. - Le démarrage et la vitalité utilisent
/health. La disponibilité utilise/ready. Ainsi, une panne de base de données arrête le trafic, mais ne redémarre jamais l’application. - 0,25 processeur virtuel avec 0,5 Gio est la plus petite combinaison.
minReplicas: 0permet de réduire le nombre de répliques à zéro.maxReplicas: 2limite les coûts et les dommages. deploy/containerapp.yamlconserve ces paramètres dans Git, sans aucun secret.az containerapp update --yamlles applique et crée une nouvelle révision.- En mode à révision unique, une nouvelle révision reçoit le trafic seulement lorsqu’elle est prête. « Succeeded » n’est pas une preuve : vérifiez la révision et les journaux système.
- La simulation montre les mêmes idées : une vérification de santé, les limites dans
docker statset une politique de redémarrage. Cette politique redémarre après un échec, pas après un arrêt manuel.
La prochaine leçon confirme que le déploiement fonctionne, consulte ses journaux, puis supprime tout à partir d’un inventaire vérifié.
Leçon suivante : Vérifier et supprimer