Ajouter des références Key Vault aux fonctions Azure

Cet article a été publié il y a plus d'un an. Les informations peuvent être obsolètes.
Octobre de cette année, GA 1 était une fonctionnalité appelée Key Vault references .
Il s'agit d'une fonction permettant de stocker des secrets gérés par Azure Functions et App Service dans Key Vault , et de les utiliser de manière transparente à partir d'applications (à utiliser comme variables d'environnement sans connaître Key Vault partir d'applications).
Cet article décrit comment obtenir ces Key Vault references . Le contenu de base est le même que celui décrit dans le document officiel de Microsoft 2, mais j'ajouterai moi-même quelques notes et conseils.
En outre, cet article décrit comment implémenter à l'aide du ARM Template et de la Azure CLI au lieu du Azure portal , ce qui vous aidera à construire une infrastructure CI / CD.
1. Ajoutez des secrets et des autorisations à Key Vault
Ajoutez les secrets et les autorisations des Azure Functions dans Key Vault .
1{2 "$schema": "https://schema.management.azure.com/schemas/2018-05-01/deploymentTemplate.json#",3 "contentVersion": "1.0.0.0",4 "parameters": {5 "keyVaultName": {6 "type": "string",7 "metadata": {8 "description": "Key Vault Name"9 }10 },11 "secretName": {12 "type": "string",13 "metadata": {14 "description": "Secret Name"15 }16 },17 "functionAppName": {18 "type": "string",19 "metadata": {20 "description": "Function App Name"21 }22 },23 "storageAccountName": {24 "type": "string",25 "metadata": {26 "description": "Storage Account Name"27 }28 }29 },30 "variables": {},31 "resources": [32 {33 "name": "[parameters('keyVaultName')]",34 "type": "Microsoft.KeyVault/vaults",35 "apiVersion": "2018-02-14",36 "location": "[resourceGroup().location]",37 "properties": {38 "tenantId": "[subscription().tenantId]",39 "sku": {40 "family": "A",41 "name": "standard"42 },43 "accessPolicies": [44 {45 "tenantId": "[subscription().tenantId]",46 "objectId": "[reference(resourceId('Microsoft.Web/sites', parameters('functionAppName')), '2016-03-01', 'Full').identity.principalId]",47 "permissions": {48 "keys": [],49 "secrets": ["get"],50 "certificates": [],51 "storage": []52 }53 }54 ],55 "enabledForDeployment": false,56 "enabledForDiskEncryption": false,57 "enabledForTemplateDeployment": false58 },59 "resources": [60 {61 "name": "[concat(parameters('keyVaultName'), '/', parameters('secretName'))]",62 "type": "Microsoft.KeyVault/vaults/secrets",63 "apiVersion": "2018-02-14",64 "dependsOn": [65 "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"66 ],67 "properties": {68 "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2015-05-01-preview').key1)]"69 }70 }71 ]72 }73 ]74}Les droits d'accès sont définis dans la partie accessPolicies . Dans la propriété appelée objectId , spécifiez l' Managed ID des Azure Functions cible. Managed ID est décrit plus loin, mais ce sont des ID attribués à Azure Functions qui peuvent être utilisés pour identifier Azure Functions et gérer les droits d'accès.
Pour les permissions , spécifiez les autorisations que vous souhaitez accorder. Dans l'exemple ci-dessus, les Azure functions seront autorisées à afficher le secret. Définissez toutes les autorisations ici en fonction de l'application.
Le secret est défini dans la ressource Microsoft.KeyVault/vaults/secrets . Spécifiez la valeur secrète dans la value des properties . Dans cet exemple, la clé du compte de stockage est définie. Spécifiez également tout secret ici en fonction de l'objectif.
2. Ajouter des paramètres d'application à Azure Functions
Ensuite, déployons les paramètres de l'application. Par souci de simplicité, seuls les paramètres pertinents pour les Key Vault references sont répertoriés.
1{2 "$schema": "https://schema.management.azure.com/schemas/2018-05-01/deploymentTemplate.json#",3 "contentVersion": "1.0.0.0",4 "parameters": {5 "keyVaultName": {6 "type": "string",7 "metadata": {8 "description": "Key Vault Name"9 }10 },11 "secretName": {12 "type": "string",13 "metadata": {14 "description": "Secret Name"15 }16 },17 "functionAppName": {18 "type": "string",19 "metadata": {20 "description": "Function App Name"21 }22 }23 },24 "variables": {25 "secretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', parameters('keyVaultName'), 'parameters('secretName')')]"26 },27 "resources": [28 {29 "name": "[concat(parameters('functionAppName'), '/appsettings')]",30 "type": "Microsoft.Web/sites/config",31 "apiVersion": "2018-11-01",32 "location": "[resourceGroup().location]",33 "properties": {34 "YOUR_SECRET": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('secretResourceId'), '2018-02-14').secretUriWithVersion, ')')]"35 }36 }37 ]38}Dans le ARM Template , définissez les valeurs comme suit:
- Générer
resourceIdindiquant une ressource secrète (définie dans la partievariables) - Obtenez l'URI secret de Key Vault avec la propriété
secretUriWithVersionpour leresourceIdde l'étape 1 - Ajoutez l'URI aux paramètres d'application au format
@Microsoft.KeyVault(SecretUri={secret uri})
Le resourceId et la reference qui apparaissent dans les exemples de modèle sont appelés fonctions de modèle. Pour plus d'informations, consultez la documentation officielle de Microsoft 3.
3. Déployer des ressources en tenant compte des dépendances
Lorsque vous utilisez des Key Vault references , gardez à l'esprit l'ordre de déploiement.
L'ordre de base est le suivant:
- Ressources
Azure Functions(Microsoft.Web/sites) Key Vault- Paramètres d'applications
Azure Functions - Déployer le zip
Azure Functions(génération d'artefacts)
Tout d'abord, déployez Azure Functions .
En effet, lorsque vous déployez Key Vault à l'étape 2, l' Managed ID pour Azure Functions doit avoir été émis à l'avance pour définir la stratégie d'accès sur Key Vault .
Managed ID peut être émis avec le modèle suivant.
1{2 "apiVersion": "2016-03-01",3 "name": "[parameters('functionAppName')]",4 "type": "Microsoft.Web/sites",5 "identity": {6 "type": "SystemAssigned"7 },8 "properties": {9 "name": "[parameters('functionAppName')]",10 "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",11 "hostNameSslStates": [12 {13 "name": "[concat(variables('functionAppName'),'.azurewebsites.net')]",14 "sslState": "Disabled",15 "virtualIP": null,16 "thumbprint": null,17 "toUpdate": null,18 "hostType": "Standard"19 },20 {21 "name": "[concat(variables('functionAppName'),'.scm.azurewebsites.net')]",22 "sslState": "Disabled",23 "virtualIP": null,24 "thumbprint": null,25 "toUpdate": null,26 "hostType": "Repository"27 }28 ],29 "siteConfig": null,30 "clientAffinityEnabled": false,31 "reserved": false,32 "httpsOnly": true33 },34 "location": "[resourceGroup().location]",35 "kind": "functionapp"36}Spécifiez l' identity la propriété avec le type SystemAssigned . Pour le moment, les Key Vault references ne sont disponibles que pour le type d'ID SystemAssigned 2.
Cependant, vous ne pouvez pas encore déployer les paramètres d'application à l'étape 1. Parce qu'à ce stade, Key Vault n'est pas déployé et vous ne pouvez pas spécifier un SecretUri , qui est obligatoire pour les Key Vault references .
Une fois Key Vault déployé à l'étape 2, déployez les paramètres d'applications Azure Functions .
Enfin, déployez les artefacts de génération Azure Functions . La mise en garde ici est que vous devez déployer le zip d'application après le déploiement des applications. Si vous déployez d'abord les artefacts de génération, puis déployez les paramètres d'application, la fonction disparaîtra.
Précautions lors de la définition d'applications à l'aide d' Azure CLI
L'exemple ci-dessus utilise le ARM Template , mais bien sûr, vous pouvez également utiliser Azure CLI .
Bien que le ARM Template écrase toujours les paramètres d'application existants, Azure CLI peut ajouter de nouveaux paramètres aux paramètres d'application existants, réduisant ainsi les contraintes de dépendance ci-dessus.
Par exemple, nous avons déclaré que les paramètres d'application à l'étape 3 doivent être après le déploiement de Key Vault à l'étape 2 et avant d'extraire le zip à l'étape 4. Mais si vous pouvez ajouter (pas remplacer) les paramètres d'application à l'aide d' Azure CLI , vous pouvez d'abord déployez les paramètres d'application autres que les Key Vault references au moment de l'étape 1, et après avoir déployé Key Vault ou extrait le zip, puis ajoutez le reste des paramètres d'application liés aux Key Vault references à l'aide d' Azure CLI .
Voici comment spécifier les paramètres d'application pour Key Vault dans Azure CLI .
1try {2 $ret = az keyvault secret show --vault-name $keyVaultName --name $secretName3}4catch5{6 $message = $_.Exception.message7 throw "Failed to get key vault secret: ${message}."8}9$secretObj = $ret | ConvertFrom-Json10$url = $secretObj.id11$secretUri = '"@Microsoft.KeyVault(SecretUri={0})"' -f $url12 13# Add appsettings for azure functions14az functionapp config appsettings set --name $functionAppName --resource-group $resourceGroup --settings YOUR_SECRET=$secretUriIl convient de noter que vous devez définir des Key Vault references au format $secretUri = '"@Microsoft.KeyVault(SecretUri={0})"' -f $url . Si vous écrivez comme $secretUri = "@Microsoft.KeyVault(SecretUri=${url})" , le dernier ) sera incorrectement défini et une erreur se produira 4.
Un autre point à noter est les autorisations requises pour exécuter les commandes ci-dessus. L'utilisateur ou le principal du service qui exécute cette commande doit avoir une autorisation de lecture pour le secret Key Vault . Dans le modèle Key Vault décrit ci-dessus, seules les Azure Functions ont reçu une autorisation de lecture, mais accordons également temporairement l'autorisation de lecture à l'exécuteur de la commande.
4. Obtenir un secret dans votre application
Tout ce que vous avez à faire est simplement d'accéder aux variables d'environnement dans votre code d'application.
1// C#2var env = System.Environment.GetEnvironmentVariable("YOUR_SECRET", EnvironmentVariableTarget.Process);3 4// Javascript5let env = process.env["YOUR_SECRET"];6 7// Java8String env = System.getenv("YOUR_SECRET");Sommaire
Cet article décrit comment utiliser les Key Vault references qui sont GA depuis octobre. L'ordre de déploiement est un peu délicat, mais sinon cela ne devrait pas être trop difficile.
Veuillez essayer de l'utiliser.




