Voeg Key Vault-verwijzingen toe aan Azure Functions

Dit artikel is meer dan een jaar geleden gepubliceerd. De informatie kan verouderd zijn.
Oktober dit jaar was GA [^3] een functie met de naam Key Vault references .
Dit is een functie om geheimen die worden verwerkt door Azure Functions en App Service op te slaan in Key Vault en om deze transparant te gebruiken vanuit applicaties (gebruik als omgevingsvariabelen zonder op de hoogte te zijn van Key Vault van applicaties).
Dit artikel beschrijft hoe u deze Key Vault references kunt bereiken. De basisinhoud is dezelfde als die beschreven in het officiële document van Microsoft [^1], maar ik zal zelf enkele opmerkingen en tips toevoegen.
Bovendien beschrijft dit artikel hoe te implementeren met behulp van ARM Template en Azure CLI plaats van Azure portal , waarmee u CI / CD-infrastructuur kunt bouwen.
1. Voeg geheimen en machtigingen toe aan Key Vault
Voeg geheimen en machtigingen van Azure Functions in 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}Toegangsrechten worden ingesteld in het gedeelte accessPolicies . Geef in de eigenschap objectId de Managed ID van de doel Azure Functions . Managed ID wordt later beschreven, maar het zijn ID's toegewezen aan Azure Functions die kunnen worden gebruikt om Azure Functions te identificeren en toegangsrechten te beheren.
Geef voor permissions de machtigingen op die u wilt verlenen. In het bovenstaande voorbeeld hebben Azure functions toestemming om het geheim te bekijken. Stel hier alle rechten in afhankelijk van de toepassing.
Het geheim bevindt zich in de bron van Microsoft.KeyVault/vaults/secrets . Geef de geheime waarde op in value van properties . In dit voorbeeld is de sleutel van het opslagaccount ingesteld. Geef hier ook een geheim op, afhankelijk van het doel.
2. Voeg applicatie-instellingen toe aan Azure Functions
Laten we vervolgens de applicatie-instellingen implementeren. Voor de eenvoud worden alleen de instellingen weergegeven die relevant zijn voor Key Vault references .
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}Stel waarden in de ARM Template als volgt in:
- Genereer
resourceIddie geheimeresourceIdaangeeft (gedefinieerd in het gedeelte metvariables) - Download de geheime URI van de Key Vault met de eigenschap
secretUriWithVersionvoor deresourceIdvan stap 1 - Voeg de uri toe aan de applicatie-instellingen in de indeling
@Microsoft.KeyVault(SecretUri={secret uri})
De resourceId en reference die in sjabloonvoorbeelden verschijnen, worden sjabloonfuncties genoemd. Raadpleeg de officiële Microsoft-documentatie [^4] voor meer informatie.
3. Implementeer bronnen met aandacht voor afhankelijkheden
Houd bij het gebruik van Key Vault references rekening met de volgorde van implementatie.
De basisvolgorde is als volgt:
Azure Functionsbronnen (Microsoft.Web/sites)Key Vault- Instellingen voor
Azure Functionsapps Azure Functionszip implementeren (artefacten bouwen)
Implementeer eerst Azure Functions .
Dit komt omdat wanneer u Key Vault in stap 2 implementeert, de Managed ID voor Azure Functions vooraf moet zijn uitgegeven om het toegangsbeleid in te stellen op Key Vault .
Managed ID kan worden uitgegeven met de volgende sjabloon.
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}Geef de woning identity met SystemAssigned type. Op dit moment zijn Key Vault references alleen beschikbaar voor SystemAssigned type ID [^1].
U kunt de appsinstellingen echter nog niet implementeren in stap 1. Omdat op dit moment Key Vault niet wordt geïmplementeerd en u geen SecretUri kunt opgeven, die verplicht is voor de Key Vault references .
Nadat Key Vault is geïmplementeerd in stap 2, implementeert u de instellingen voor Azure Functions apps.
Implementeer ten slotte de Azure Functions om artefacten te bouwen. Het voorbehoud hier is dat u de toepassings-zip moet implementeren nadat de apps-instellingen zijn geïmplementeerd. Als u eerst de build-artefacten implementeert en vervolgens de apps-instellingen implementeert, verdwijnt de functie.
Voorzorgsmaatregelen bij het instellen van applicaties met Azure CLI
In het bovenstaande voorbeeld wordt de ARM Template , maar u kunt natuurlijk ook de Azure CLI .
Hoewel ARM Template altijd bestaande applicatie-instellingen overschrijft, kan Azure CLI nieuwe instellingen toevoegen aan bestaande applicatie-instellingen, waardoor de bovengenoemde afhankelijkheidsbeperkingen worden verminderd.
We hebben bijvoorbeeld aangegeven dat de apps-instellingen in stap 3 na de Key Vault implementatie in stap 2 moeten zijn en voordat de zip in stap 4 wordt uitgepakt. Maar als u de apps-instellingen kunt toevoegen (niet overschrijven) met behulp van de Azure CLI , kunt u eerst implementeer de applicatie-instellingen anders dan de Key Vault references op het tijdstip van stap 1, en na het implementeren van de Key Vault of het uitpakken van de zip, voeg vervolgens de rest van de apps-instellingen toe die gerelateerd zijn aan de Key Vault references met behulp van de Azure CLI .
Zo kunt u toepassingsinstellingen opgeven voor Key Vault in 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=$secretUriOpgemerkt moet worden dat u Key Vault references moet instellen in het formaat van $secretUri = '"@Microsoft.KeyVault(SecretUri={0})"' -f $url . Als u schrijft als $secretUri = "@Microsoft.KeyVault(SecretUri=${url})" , wordt de laatste ) onjuist ingesteld en treedt er een fout op [^2].
Een ander aandachtspunt is de machtigingen die nodig zijn om de bovenstaande opdrachten uit te voeren. De gebruiker of service-principal die deze opdracht uitvoert, moet leesmachtiging hebben voor het Key Vault geheim. In het hierboven beschreven Key Vault sjabloon kregen alleen Azure Functions leesrechten, maar laten we ook tijdelijk leesrechten verlenen aan de opdrachtuitvoerder.
4. Een geheim krijgen in uw toepassing
Het enige wat u hoeft te doen is alleen toegang te krijgen tot de omgevingsvariabelen in uw applicatiecode.
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");Samenvatting
In dit artikel wordt beschreven hoe Key Vault references die sinds oktober GA zijn. De volgorde van plaatsing is een beetje lastig, maar anders zou het niet te moeilijk moeten zijn.
Probeer het alstublieft.
[^1]: Use Key Vault references for App Service and Azure Functions [^2]: Incorrect config value set [^3]: Key Vault references in App Service and Azure Functions are now available [^4]: Resource functions for Azure Resource Manager templates




