[67] Bootstrap de l'état Terraform distant #121
No reviewers
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!121
Loading…
Reference in a new issue
No description provided.
Delete branch "florian/67-bootstrap-etat-terraform"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Crée hors Terraform le conteneur qui portera terraform.tfstate : le backend
azurerm est lu avant tout
resource, il ne peut pas créer son propre support.Le script s'écarte du ticket sur quatre points, imposés par l'abonnement école :
rg-FHeuze-eadl, qui n'existe pas ;
doublé : l'étiquette storageaccountnumber du groupe plafonne leur nombre ;
usersur toute ressource,reprise de celle du groupe pour que le script serve à chaque membre ;
ne donne pas le droit d'y écrire. Storage Blob Data Contributor est donc
attribué au compte connecté, sans quoi le
terraform initdu #68 échoueraiten 403 avec tout en place. L'attribution passe par az rest, az role
assignment échouant en MissingSubscription faute d'accès à Entra ID.
Aucune clé de compte n'est lue : tout passe par le plan de gestion et
l'identité d'az login, comme le demande l'ADR 0007.
Ce que ça change
Closes #67
Preuve
Branche florian/67-bootstrap-etat-terraform, commit 094d961. Livrables :
infra/terraform/bootstrap.sh et docs/runbooks/terraform-etat.md.
Le script, deuxième passage — rejoué quatre fois, sortie identique, aucune erreur ni effet de bord :
$ bash infra/terraform/bootstrap.sh
== état Terraform distant : stenervisiong2tfstate/tfstate dans rg-FHeuze2023_cours-projet-eadl ==
session florian.heuze2023@campus-eni.fr
groupe rg-FHeuze2023_cours-projet-eadl (user=FHeuze2023)
compte stenervisiong2tfstate déjà présent
blob versioning actif
conteneur tfstate déjà présent
rôle « Storage Blob Data Contributor » déjà attribué
== conteneur d'état prêt ==
Le conteneur et les propriétés demandées :
$ az storage container show -n tfstate --account-name stenervisiong2tfstate --auth-mode login
{ "nom": "tfstate", "public": null }
$ az storage account show -n stenervisiong2tfstate -g rg-FHeuze2023_cours-projet-eadl
{ "sku": "Standard_LRS", "kind": "StorageV2", "tls": "TLS1_2",
"blobPublic": false, "region": "francecentral", "tags": { "user": "FHeuze2023" } }
$ az storage account blob-service-properties show --account-name stenervisiong2tfstate -g rg-FHeuze2023_cours-projet-eadl
{ "versioning": true }
Relecture
Ce qui suit le code
Où regarder en priorité
Revue du script
bootstrap.shet du runbook. Rien de bloquant : le script tourne, il est idempotent (preuve à l'appui), les 4 critères du #67 sont couverts, et les 4 écarts au ticket (RG, compte adopté, taguser, rôle de données) sont chacun justifiés dans le corps de PR et dans le runbook. Restent des fragilités réelles, surtout autour de l'attribution de rôle.Majeur
A. Le repli d'extraction de l'OID (l.161-162) est cassé. Le payload d'un JWT est du base64url non paddé.
cut -d. -f2 | base64 -déchoue dès qu'il y a un-/_ou une longueur non multiple de 4 -> sortie vide ->objetvide -> « identité non déterminée, rôle non posé ». Ça marche « parfois », par chance sur la longueur. Or ce repli existe précisément pour le cas « pas d'accès Entra ID », c'est donc lui qui a le plus de chances d'être exercé. Correctif :Au minimum : vérifier qu'il produit bien un GUID sur un poste où
az ad signed-in-user showéchoue.B. L'idempotence de l'attribution de rôle repose sur un GET dont toutes les erreurs sont avalées (
2>/dev/null, l.176). Sur un throttle/429 ou une erreur transitoire du plan de gestion, legrep -q '^[1-9]'échoue -> le script tente unPUTavec un GUID neuf -> Azure répond 409RoleAssignmentExists-> affiche « ATTENTION : n'a pas pu être attribué » alors que tout va bien. Le « rejoué 4 fois, sortie identique » ne tient que si le control plane est sain à chaque passage. Distinguer « déjà attribué » d'une vraie erreur de lecture rendrait le message honnête.C.
compte_id(l.157) etabonnement(l.52) sont les deux seuls appelsaznon gardés dans un script par ailleurs soigneusement gardé. Uncompte_idvide donne une URLAPI_ROLESmalformée -> échec confus en fin de course. Deux lignes de garde suffisent.Mineur
D. Le parsing booléen
-o tsv(dispo,existe) supposetrue/falseminuscules. Vérifié OK sur az 2.90, mais les CLI plus anciennes rendentTrue/Falseet les comparaisons[ "$existe" = "true" ]passent silencieusement à côté (tente de recréer un conteneur existant, saute le message « nom déjà pris »). Épingler une versionazminimale, ou comparer en insensible à la casse.E. « remet le compte dans les clous » est un peu surévalué : le ré-assert (l.115-121) ne couvre que TLS / public-access / https-only (+ versioning l.126). Ni SKU, ni kind, ni le tag
user. Et si le compte adopté perd son taguser, c'est l'az storage account updatelui-même qui se fait deny par la politique, avec le message générique « impossible de réappliquer les propriétés ».F. Le fichier est
100644, pas exécutable, malgré le shebang. Les docs l'appellent viabash ...donc ça marche, maischmod +xest la convention.G. Aucun contrôle de tenant. Le script fait confiance à l'abonnement par défaut ; l'ADR 0007 verrouille le tenant
7f4f3591-.... Un membre dont le tenant ENI n'est pas le défaut obtient « le groupe n'existe pas » au lieu de « mauvais tenant ».az account show --query tenantIdcomparé en une ligne.Nits
094d961; la tête de PR estcaffe61. Obsolète.terraform init» fera gagner du temps réel au prochain.Ce qui est bien
Plan de gestion uniquement (
container-rm,az rest) pour ne jamais lire de clé de compte : conforme ADR 0007, propre. Design d'idempotence réfléchi (show-puis-agir, messages « créé » / « déjà présent » distincts). Portabilité poste Windows anticipée (repliuuidgen). Les écarts au ticket sont tracés aux deux endroits.New commits pushed, approval review dismissed automatically according to repository settings
New commits pushed, approval review dismissed automatically according to repository settings