« Grrrr DevOps Pipeline... premier gros crash 😤 » : différence entre les versions
Ce week-end, un gros crash est survenu dans nos pipelines DevOps suite à la mise à jour automatique du module Az.Accounts v5 dans Azure. Le cmdlet Get-AzAccessToken retourne désormais un SecureString au lieu d’un String. Comme nos anciens scripts SQL ne savent pas le gérer, tout a planté en production. Le vrai souci : le warning existait, mais personne ne l’a vu car tout tourne dans un backend silencieux. 👉 Leçon : toujours surveiller les warnings de breaking change, même en arrière-plan. |
Cette version a été marquée à traduire |
||
(Une version intermédiaire par le même utilisateur non affichée) | |||
Ligne 1 : | Ligne 1 : | ||
<languages/> | |||
<translate> | |||
<!--T:1--> | |||
Je savais que Microsoft avait prévenu… mais comme souvent, personne n’a vu passer l’info sérieusement 😅 | Je savais que Microsoft avait prévenu… mais comme souvent, personne n’a vu passer l’info sérieusement 😅 | ||
<!--T:2--> | |||
On bosse dans une équipe ''fullstack DevOps'', avec des scripts qui appellent des procédures SQL dans des '''milliers de bases Azure SQL''', que ce soit pour de la maintenance, des exports, du nettoyage… bref, du classique. | On bosse dans une équipe ''fullstack DevOps'', avec des scripts qui appellent des procédures SQL dans des '''milliers de bases Azure SQL''', que ce soit pour de la maintenance, des exports, du nettoyage… bref, du classique. | ||
<!--T:3--> | |||
Et pour ça, '''on utilise le token obtenu avec la fonction <code>Get-AzAccessToken</code>'''. | Et pour ça, '''on utilise le token obtenu avec la fonction <code>Get-AzAccessToken</code>'''. | ||
<!--T:4--> | |||
Le hic ? Microsoft met à jour en continu leur backend. Donc le '''pool d’Azure Pipeline''' qui exécute nos scripts PowerShell est mis à jour automatiquement, sans intervention de notre part. | Le hic ? Microsoft met à jour en continu leur backend. Donc le '''pool d’Azure Pipeline''' qui exécute nos scripts PowerShell est mis à jour automatiquement, sans intervention de notre part. | ||
<!--T:5--> | |||
Et ce dimanche… '''patatras 💥''' : ils ont mis à jour le module '''Az.Accounts de la version 4 vers la 5''', avec un '''breaking change majeur''' :<blockquote>Le token n’est plus retourné en <code>String</code>, mais en <code>SecureString</code> !</blockquote>Résultat ? Toutes les fonctions plus anciennes qui manipulent ces tokens n’arrivent plus à les lire, et '''ça casse tout. En prod.''' 😩 | Et ce dimanche… '''patatras 💥''' : ils ont mis à jour le module '''Az.Accounts de la version 4 vers la 5''', avec un '''breaking change majeur''' :<blockquote>Le token n’est plus retourné en <code>String</code>, mais en <code>SecureString</code> !</blockquote>Résultat ? Toutes les fonctions plus anciennes qui manipulent ces tokens n’arrivent plus à les lire, et '''ça casse tout. En prod.''' 😩 | ||
<!--T:6--> | |||
Le pire ? Comme tout tourne dans un backend, '''on ne remonte pas les warnings''', donc '''personne ne l’a vu venir'''. C’est seulement une fois que les exports sont tombés en erreur qu’on a compris. | Le pire ? Comme tout tourne dans un backend, '''on ne remonte pas les warnings''', donc '''personne ne l’a vu venir'''. C’est seulement une fois que les exports sont tombés en erreur qu’on a compris. | ||
<!--T:7--> | |||
🎓 Leçon apprise : ne jamais ignorer les warnings… même s’ils sont planqués dans les logs. | 🎓 Leçon apprise : ne jamais ignorer les warnings… même s’ils sont planqués dans les logs. | ||
<!--T:8--> | |||
🔧 Fix : il faut ajouter le paramètre <code>-AsPlainText</code> dans certains cas ou revoir complètement la gestion du token selon le module utilisé. | 🔧 Fix : il faut ajouter le paramètre <code>-AsPlainText</code> dans certains cas ou revoir complètement la gestion du token selon le module utilisé. | ||
<!--T:9--> | |||
Voici le warning qu’on aurait dû prendre au sérieux : | Voici le warning qu’on aurait dû prendre au sérieux : | ||
<!--T:10--> | |||
<syntaxhighlight lang="pwsh"> | <syntaxhighlight lang="pwsh"> | ||
get-azaccesstoken | get-azaccesstoken | ||
Ligne 25 : | Ligne 37 : | ||
Note : https://aka.ms/azps-changewarnings | Note : https://aka.ms/azps-changewarnings | ||
<!--T:11--> | |||
</syntaxhighlight>WorkArround<syntaxhighlight lang="powershell"> | </syntaxhighlight>WorkArround<syntaxhighlight lang="powershell"> | ||
$azAccountsVersion = (Get-Module -ListAvailable -Name Az.Accounts | Sort-Object Version -Descending | Select-Object -First 1).Version | $azAccountsVersion = (Get-Module -ListAvailable -Name Az.Accounts | Sort-Object Version -Descending | Select-Object -First 1).Version | ||
Ligne 37 : | Ligne 50 : | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
</translate> | |||
[[Catégorie:Boîte à idées]] | [[Catégorie:Boîte à idées]] |
Dernière version du 5 juin 2025 à 14:50
Je savais que Microsoft avait prévenu… mais comme souvent, personne n’a vu passer l’info sérieusement 😅
On bosse dans une équipe fullstack DevOps, avec des scripts qui appellent des procédures SQL dans des milliers de bases Azure SQL, que ce soit pour de la maintenance, des exports, du nettoyage… bref, du classique.
Et pour ça, on utilise le token obtenu avec la fonction Get-AzAccessToken
.
Le hic ? Microsoft met à jour en continu leur backend. Donc le pool d’Azure Pipeline qui exécute nos scripts PowerShell est mis à jour automatiquement, sans intervention de notre part.
Et ce dimanche… patatras 💥 : ils ont mis à jour le module Az.Accounts de la version 4 vers la 5, avec un breaking change majeur :
Le token n’est plus retourné en
String
, mais enSecureString
!
Résultat ? Toutes les fonctions plus anciennes qui manipulent ces tokens n’arrivent plus à les lire, et ça casse tout. En prod. 😩
Le pire ? Comme tout tourne dans un backend, on ne remonte pas les warnings, donc personne ne l’a vu venir. C’est seulement une fois que les exports sont tombés en erreur qu’on a compris.
🎓 Leçon apprise : ne jamais ignorer les warnings… même s’ils sont planqués dans les logs.
🔧 Fix : il faut ajouter le paramètre -AsPlainText
dans certains cas ou revoir complètement la gestion du token selon le module utilisé.
Voici le warning qu’on aurait dû prendre au sérieux :
get-azaccesstoken
WARNING: Upcoming breaking changes in the cmdlet 'Get-AzAccessToken' :
The Token property of the output type will be changed from String to SecureString. Add the [-AsSecureString] switch to avoid the impact of this upcoming breaking change.
- The change is expected to take effect in Az version : '14.0.0'
- The change is expected to take effect in Az.Accounts version : '5.0.0'
Note : https://aka.ms/azps-changewarnings
WorkArround
$azAccountsVersion = (Get-Module -ListAvailable -Name Az.Accounts | Sort-Object Version -Descending | Select-Object -First 1).Version
$dexResourceUrl = 'https://database.windows.net/'
if ($azAccountsVersion -ge [Version]'5.0.0') {
write-host "Az.Accounts 5.0.0 and above"
$AccessTokenSecure = (Get-AzAccessToken -ResourceUrl $dexResourceUrl).Token
$token = ConvertFrom-SecureString -SecureString $AccessTokenSecure -AsPlainText
} else {
write-host "Az.Accounts below 5.0.0"
$token = (Get-AzAccessToken -ResourceUrl $dexResourceUrl).Token
}