Проблема с кэшированием объекта конфигурации функции Azure - PullRequest
0 голосов
/ 04 апреля 2020

Настройки моего приложения Azure функционального приложения, имеют ссылку на keyvault, например @ Microsoft.KeyVault (SecretUri = https://myvalut.vault.azure.net/secrets/mySecret/), всякий раз, когда в keyvault вводится новая версия mySecret, функция Azure по-прежнему отображает старое / устаревшее значение, а не последнее значение / версию «mySecret».

Если я открываю настройки приложения с помощью KUDU (https://myhttpfunc.scm.azurewebsites.net/api/settings), я вижу «mySecret»: "onemoretry", где "onemoretry" является старой ценностью. Только Azure fun c перезапуск приложения обновляет «mySecret» новым значением.

Как создать функцию Azure, которая использует ссылку на keyvault для извлечения последнего значения / версии целевого секрета keyvault, как и когда получить обновление без Azure перезапуска функции?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Ссылка предназначена для конфигурации приложения, которая обычно выбирается и кэшируется при запуске или первом использовании (последнее в этом случае). Он не предназначен для получения каждый раз. Например, если вы хотите управлять временем жизни через ETag, вы можете рассмотреть Azure Конфигурация приложения. Если вам нужно, чтобы эти значения были зашифрованы в состоянии покоя только с ограниченным набором людей, которые могут получить к ним доступ, вы не сможете использовать секреты таким образом, но вместо этого вам придется самостоятельно вызывать Azure Key Vault, но вы все равно должны это сделать. кэшируйте значение в течение ограниченного времени: Key Vault имеет очень низкие пределы скорости, поэтому, если ваша функция получает много вызовов за короткий промежуток времени, некоторые из них могут быть заблокированы и завершены сбоем (есть встроенная политика повторов, но это не поможет, если запросы будут быстро ставиться в очередь).

Например, вы можете просто получить секрет самостоятельно (предполагается, что C#, поскольку неясно, какой язык вы используете):

var vaultUri = Environment.GetEnvironmentVariable("AZURE_KEYVAULT_URL") ?? throw new InvalidOperationException();
var client = new SecretClient(new Uri(vaultUri), new DefaultAzureCredential());
KeyVaultSecret secret = await client.GetSecretAsync("my-secret");

Существует несколько механизмов кэширования в памяти, которые вы можете использовать в зависимости от того, как запускается ваша функция, например, таймер, который запускается время от времени и обновляет сам секрет. Key Vault не поддерживает ETag, поэтому каждый запрос будет для ключа независимо от того, был ли он изменен. Вы можете запросить, изменилась ли версия, но это немного вас экономит (вам все равно придется извлекать полный секрет, так что это 2 запроса, при которых вы можете просто извлечь секрет в 1 запросе через каждый интервал).

0 голосов
/ 04 апреля 2020

Вы можете использовать Resource Explorer . Когда вы найдете то, что хотите отредактировать, он фактически сообщит вам о конечной точке, которую вам нужно нажать, чтобы взаимодействовать с ней.

Настройки приложения будут доступны в разделе: subscriptions -> resourceGroups -> [your app's resource group] -> providers -> Microsoft.Web -> sites -> [your app name] -> config -> appsettings

Таким образом, вы можете использовать PUT с предоставленной конечной точкой и изменять значения по мере необходимости.

Я не пытался использовать REST API, и он может работать не так, как вы хочу это; где обновляемые значения должны переопределять то, что кэшируется.

Дополнительная информация: https://docs.microsoft.com/en-us/rest/api/appservice/WebApps/UpdateApplicationSettings http://blog.davidebbo.com/2015/12/calling-arm-using-plain-rest.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...