Voeg Key Vault-verwijzingen toe aan Azure Functions

⏱️4 min
Delen:

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 .

json
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": false
58 },
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 .

json
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:

  1. Genereer resourceId die geheime resourceId aangeeft (gedefinieerd in het gedeelte met variables )
  2. Download de geheime URI van de Key Vault met de eigenschap secretUriWithVersion voor de resourceId van stap 1
  3. 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:

  1. Azure Functions bronnen ( Microsoft.Web/sites )
  2. Key Vault
  3. Instellingen voor Azure Functions apps
  4. Azure Functions zip 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.

json
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": true
33 },
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 .

powershell
1try {
2 $ret = az keyvault secret show --vault-name $keyVaultName --name $secretName
3}
4catch
5{
6 $message = $_.Exception.message
7 throw "Failed to get key vault secret: ${message}."
8}
9$secretObj = $ret | ConvertFrom-Json
10$url = $secretObj.id
11$secretUri = '"@Microsoft.KeyVault(SecretUri={0})"' -f $url
12
13# Add appsettings for azure functions
14az functionapp config appsettings set --name $functionAppName --resource-group $resourceGroup --settings YOUR_SECRET=$secretUri

Opgemerkt 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.

csharp
1// C#
2var env = System.Environment.GetEnvironmentVariable("YOUR_SECRET", EnvironmentVariableTarget.Process);
3
4// Javascript
5let env = process.env["YOUR_SECRET"];
6
7// Java
8String 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

Delen:

Gerelateerde artikelen

Beschrijf Azure-resources als ARM Template
Software

Beschrijf Azure-resources als ARM Template

ARM Template is een json-bestand dat Azure-resources definieert. Leer hoe u efficiënt ARM Templates kunt maken.

mark241
Backend verbinden met Azure API Management
Software

Backend verbinden met Azure API Management

Leer hoe u API's toevoegt aan API Management met ARM Template. Gebruik operations, policy en backend resources.

mark241
Android applicatie CI/CD met Flutter
Software

Android applicatie CI/CD met Flutter

Leer hoe u CI/CD-pipelines bouwt voor Android-apps met Flutter. Gebaseerd op GitHub Actions, zonder fastlane.

mark241