下面 Http 触发了 Azure 函数在消费模式下运行,即使在 1 小时的空闲时间后也不会从 Azure Keyvault 返回最新的秘密值
根据az func scaling的假设:当 -20 分钟内未收到任何请求时,Azure 函数应用程序将被删除(或)缩小到零。
如果上述假设成立,则 Startup.cs 将在空闲时间后的下一次调用中被调用,这将依次连接到 keyvault 以获取最新的秘密值并相应地使用最新的秘密值更新 appconfig.cs 但这不会发生,即使在空闲时间之后仍然返回旧的秘密值。此行为意味着即使在空闲时间之后,函数应用程序也可能不会按比例缩小。
为什么托管 http 触发功能的功能应用程序即使在空闲时间后也不会缩小?
为什么会观察到上述返回陈旧秘密值的行为?需要做什么来克服秘密值的陈旧性?
PS:目前功能应用重启仅从键值返回最新的秘密值。
不知道我对 Azure 功能的无服务器架构有什么误解?
在 Startup.cs 上
[assembly: FunctionsStartup(typeof(Startup))]
namespace SampleAzureFunction
{
public class Startup : FunctionsStartup
{
private AppConfig _appConfig;
public IConfigurationRoot _configuration;
public override void Configure(IFunctionsHostBuilder builder)
{
var configurationBuilder = new ConfigurationBuilder()
.SetBasePath(currentDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
_appConfig = new AppConfig();
_configuration = configurationBuilder.Build();
ConfigurationBinder.Bind(_configuration, _appConfig);
//here c# code to Update appConfig=>DBConfig=>PrimaryKey with secret value mentioned in keyvault using "KeyVaultClient" class in Microsoft.Azure.KeyVault namespace
.....
.....
builder.Services.AddSingleton<IAppConfig>(_appConfig);
}
}
}
在 MyClass.cs 上
namespace SampleAzureFunction
{
public class MyClass
{
private readonly IAppConfig _appConfig;
public MyClass(IAppConfig appConfig)
{
_appConfig = appConfig;
}
[FunctionName("myfunc")]
public async Task<IActionResult> RunAsync([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req)
{
var secret= _appConfig.PrimaryKey;
return secret; //always return old secret not the new secret update in keyvault even after fun app idletime of >1hour
}
}
}
应用设置.cs
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": ""
},
"AzureKeyVaultConfig: {
"VaultUrl": ""
},
"DBConfig": {
"DBUri": "",
"PrimaryKey": "", //not configured in appsettings but in keyvault
"DBName": ""
}
}