Grrrr DevOps Pipeline... first major crash đ€
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.
RĂ©sultat ? Toutes les fonctions plus anciennes qui manipulent ces tokens nâarrivent plus Ă les lire, et ça casse tout. En prod. đ©Le token nâest plus retournĂ© en
String
, mais enSecureString
!
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
</div>
<div lang="fr" dir="ltr" class="mw-content-ltr">
$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
}