Création d'un modèle ARM qui doit installer un certificat SSL situé à l'intérieur d'un coffre de clés Azure. Si je spécifie le certificat avec l'empreinte numérique, cela fonctionne bien:
"secrets": [ { "sourceVault": { "id": "[resourceId(parameters('keyVaultResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('keyVaultName'))]" }, "vaultCertificates": [ { "certificateUrl": "https://contoso.vault.azure.net/secrets/web01-test-contoso-com/latest", "certificateStore": "My" } ] } ]
Mais comme un certificat est sur une horloge, cela code en dur une dépendance qui peut devenir obsolète dans le modèle ARM. Je préfère simplement spécifier la dernière version (comme cela apparaît dans le portail). Cependant, je n'ai trouvé aucune documentation qui montre comment faire cela ou même mentionne si c'est possible.
J'ai effectué quelques expériences en utilisant:
message '{ "error": { "code": "InvalidParameter", "message": "https://contoso.vault.azure.net/secrets/web01-test-contoso-com/latest is not a valid versioned Key Vault Secret URL. It should be in the format https://<vaultEndpoint>/secrets/<secretName>/<secretVersion>.", "target": "certificateUrl" } }'
et
https://contoso.vault.azure.net/secrets/web01-test-contoso-com/latest
Mais dans les deux cas, j'ai eu le même message d'erreur:
https://contoso.vault.azure.net/secrets/web01-test-contoso-com
Ma question est donc : Comment puis-je référencer le certificat de manière à obtenir la dernière version?
Pour plus de clarté, j'utilise l'URL dans la section secrets
du modèle ARM pour une machine virtuelle comme suit, qui obtient le certificat du coffre de clés Azure et l'installe dans le magasin de certificats Windows.
https://contoso.vault.azure.net/secrets/web01-test-contoso-com/968bf207451149d3aceb390065af9d3a
REMARQUE: Je trouverais étrange que vous puissiez spécifier la dernière version d'un système d'exploitation à installer, mais vous ne pouvez pas spécifier d'installer la dernière version d'un certificat.
3 Réponses :
Il n'y a pas de moyen direct \ facile de le faire. Key Vault n'est pas vraiment compatible avec les modèles de bras.
Comme juunas l'a proposé, vous pouvez écrire un script ou utiliser une extension de script personnalisée pour extraire ces données directement du coffre de clés en utilisant l'identité de service géré, par exemple.
D'après la réponse de @ 4c74356b41, je l'ai fait moi-même en script python.
data = json.loads(kv_auth_response.content) # ## Lets find youngest vesrion of certificate # if len(data['value']) > 0: for x in range(len(data['value'])): if x == 0: youngest = data['value'][x]['attributes']['exp'] cert_url = data['value'][x] if data['value'][x]['attributes']['exp'] > youngest: youngest = data['value'][x]['attributes']['exp'] cert_url = data['value'][x] arry = cert_url['id'].split('/') ... cert_version = arry[len(arry)-1]
À la première étape de la boucle, la valeur de la date d'expiration est affectée à la variable "la plus jeune". Dans les étapes suivantes, le script compare la date d'expiration à celle-ci et attribue le moment où la condition est remplie. Après la boucle, le script se sépare avec "yougests" cert_url et assigne la dernière partie du tableau à la variable "cert_version".
Vous pouvez voir une vue complète de ce problème dans mon script à BYOC pour le domaine personnalisé. Lien: https: // github. com / przemika / azure-byoc-pour-domaine-personnalisé / blob / master / start-byoc.py
C'est possible, contrairement à ce que dit la réponse acceptée. Définissez la variable avec l'ID de ressource de secret comme ceci, par exemple:
"certificateUrl": "[reference(variables('mySecretResourceId'), '2018-02-14').secretUriWithVersion]"
puis vous pouvez l'utiliser dans votre modèle comme suit:
"mySecretResourceId": "[concat(resourceGroup().id,'/providers/Microsoft.KeyVault/vaults/', variables('keyVaultName'), '/secrets/', 'my-secret-name')]"
peut être simplifié: resourceId ('Microsoft.KeyVault / voults / secrets', 'kvname', 'secret name')
. belle prise cependant
non, ce n'est pas vrai, peu importe si la ressource existe. resourceId () fonctionnera toujours
Dans le cas où cela n'est pas possible, vous pouvez écrire un script qui effectue cette opération après le déploiement d'ARM.
Dans votre pipeline, ajoutez un script qui obtient la dernière version, puis transmettez-le en tant que paramètre dans le modèle arm.