Добавить ссылки на хранилище ключей в функции Azure

Эта статья была опубликована б олее года назад. Информация может быть устаревшей.
В октябре этого года функция, называемая Key Vault references была GA 1.
Это функция для хранения секретов, обрабатываемых Azure Functions и App Service Azure Functions в Key Vault и прозрачного использования их из приложений (используйте в качестве переменных среды, не зная о Key Vault из приложений).
В этой статье описывается, как добиться этого Key Vault references . Осн овное содержание такое же, как описано в официальном документе Microsoft 2, но я добавлю некоторые заметки и советы самостоятельно.
Кроме того, в этой статье описывается, как реализовать использование ARM Template и Azure CLI вместо Azure portal , что поможет вам создать инфраструктуру CI / CD.
1. Добавьте секреты и разрешения в Key Vault
Добавьте секреты и разрешения функций Azure Functions в 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}Права доступа задаются в разделе accessPolicies . В свойстве с именем objectId укажите Managed ID целевых Azure Functions . Managed ID описан ниже, но это идентификаторы, назначенные Azure Functions которые можно использовать для идентификации Azure Functions и управления правами доступа.
Для permissions укажите ра зрешения, которые вы хотите предоставить. В приведенном выше примере Azure functions будут иметь разрешение на просмотр секрета. Установите любые разрешения здесь в соответствии с приложением.
Секрет установлен в ресурсе Microsoft.KeyVault/vaults/secrets . Укажите секретное значение в value properties . В этом примере ключ учетной записи хранения установлен. Также укажите любой секрет здесь в соответствии с целью.
2. Добавьте параметры приложения в Azure Functions
Далее давайте развернем настройки приложения. Для простоты перечислены только параметры, относящиеся к 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}В ARM Template установите значения следующим образом:
- Генерируйте
resourceIdуказывающий секретный ресурс (определенный в частиvariables) - Получите секретный URI хранилища ключей со свойством
secretUriWithVersionдляresourceIdшага 1 - Добавьте uri в настройки приложения в формате
@Microsoft.KeyVault(SecretUri={secret uri})
resourceId и reference которые появляются в примерах Template, называются функциями шаблона. Для получения дополнительной информации см. Официальную документацию Microsoft 3.
3. Развертывание ресурсов с учетом зависимостей
При использовании Key Vault references порядок развертывания.
Основной порядок выглядит следующим образом:
- Ресурсы
Azure Functions(Microsoft.Web/sites) Key Vault- Настройки приложений
Azure FunctionsAzure - Развертывание zip-
Azure Functions(сборка артефактов)
Сначала разверните Azure Functions .
Это связано с тем, что при развертывании Key Vault на шаге 2 Managed ID для Azure Functions должен быть выдан заранее, чтобы установить политику доступа к Key Vault .
Managed ID может быть выдан с помощью следующего шаблон а.
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}Укажите identity свойства с типом SystemAssigned . В настоящее время Key Vault references доступны только для SystemAssigned типа SystemAssigned 2.
Однако вы не можете развернуть настройки приложений еще на шаге 1. Поскольку на этом этапе Key Vault не развернуто, и вы не можете указать SecretUri , что является обязательным для Key Vault references .
После развертывания Key Vault на шаге 2 разверните настройки приложений Azure Functions Azure.
Наконец, разверните артефакты сборки Azure Functions . Предостережение заключается в том, что вам необходимо развернуть zip-файл приложения после развертывания настроек приложения. Если сначала развернуть артефакты сборки, а затем развернуть настройки приложения, функция исчезнет.
Меры предосторожности при настройке приложений с помощью Azure CLI
В приведенном выше примере используется ARM Template , но, конечно, вы также можете использовать Azure CLI .
В то время как ARM Template всегда перезаписывает существующие параметры приложения, Azure CLI может добавлять новые параметры в существующие параметры приложения, тем самым уменьшая вышеуказанные ограничения зависимостей.
Например, мы заявили, что настройки приложения на шаге 3 должны быть после развертывания Key Vault на шаге 2 и перед извлечением zip на шаге 4. Но если вы можете добавить (не перезаписать) настройки приложения с помощью Azure CLI , вы можете сначала разверните параметры приложения, отличные от Key Vault references во время шага 1 и после развертывания Key Vault или извлечения zip-файла добавьте остальные параметры приложения, связанные со Key Vault references с помощью Azure CLI .
Это как указать параметры приложения для Key Vault в 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=$secretUriСледует отметить, что вам нужно установить Key Vault references на Key Vault references в формате $secretUri = '"@Microsoft.KeyVault(SecretUri={0})"' -f $url . Если вы напишите как $secretUri = "@Microsoft.KeyVault(SecretUri=${url})" , последний ) будет неправильно установлен, и произойдет ошибка 4.
Еще один момент, на который следует обратить внимание, - это разрешения, необходимые для выполнения вышеуказанных команд. Пользователь или участник службы, выполняющий эту команду, должен иметь разрешение на чтение секретного Key Vault . В шаблоне Key Vault описанном выше, разрешение на чтение было предостав лено только Azure Functions , но давайте временно предоставим разрешение на чтение и исполнителю команды.
4. Получение секрета в вашем приложении
Все, что вам нужно сделать, это просто получить доступ к переменным среды в коде приложения.
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");Резюме
В этой статье описывается, как использовать Key Vault references которые были GA с октября. Порядок развертывания немного сложнее, но в остальном он не должен быть слишком сложным.
Пожалуйста, попробуйте использовать это.




