我正在使用
dotnet-isolated
将 .NET 6 进程内 Azure Function 应用程序移植到 .NET 8。
我们不会将我们的秘密存储在源代码管理/本地中。因此,对于本地开发,之前我们在
local.settings.json
: 中使用了占位符值
"ServiceBus:ConnectionString": "<secret>"
我们将使用 KeyVault 配置在
Startup.cs
中覆盖它。然后我们的函数输入绑定将引用 ConnectionStrings
/etc 的设置:
[Function("MyFunction")]
public async Task Run([ServiceBusTrigger(
"%ServiceBus:Topic%",
"%ServiceBus:Subscription%",
Connection = "ServiceBus:ConnectionString")]
string sbMessage)
{
// does stuff
// (this example is after already moving to .NET 8/isolated
// but the function binding is essentially the same as before)
}
一切都会很好。
切换到
dotnet-isolated
后,我的函数现在在启动时抛出错误,因为函数绑定似乎仍在传递值 "<secret>"
,而不是来自 KeyVault 的实际值。
如果我简单地将
"<secret>"
中的 local.settings.json
替换为实际正确的连接字符串值,则一切正常。但我需要继续使用这个 <secret>
约定。
我已在 .NET 8 中复制了该启动功能
Program.cs
:
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureAppConfiguration((context, builder) =>
{
var environment = context.HostingEnvironment;
if (environment.IsDevelopment())
{
builder.AddEnvironmentVariables();
var builtConfig = builder.Build();
var secretClient = new SecretClient(
new Uri($"https://{builtConfig["KeyVault:Name"]}.vault.azure.net/"),
new DefaultAzureCredential());
builder.AddAzureKeyVault(secretClient, new KeyVaultSecretManager());
}
})
.ConfigureServices((hostContext, services) =>
{
// does stuff
})
.Build();
host.Run();
当我调试
ConfigureAppConfiguration()
时,我可以看到 builder
确实 已正确应用 KeyVault 配置。 "ServiceBus:ConnectionString"
设置为正确的值,然后当我进入 ConfigureServices()
时,我可以看到 hostContext.Configuration
也应用了正确的 KeyVault 值。
如何正确获取函数输入绑定以在启动时遵守覆盖的 KeyVault 配置?
我不希望您共享的配置在本地或任何地方工作。值
<secret>
将被解释为连接字符串并且无法解析,这与您看到的错误相匹配。
要工作,本地环境中的某些内容必须告诉触发器要连接到哪个服务总线命名空间以及如何进行身份验证。对于任何托管模型来说,都没有办法解决这个问题。进程内和隔离都需要这个。
您可以使用基于身份的身份验证在本地无需密码的情况下执行此操作,为此您可以创建一个名为
ServiceBus:ConnectionString__fullyQualifiedNamespace
的本地设置,该设置指向您的服务总线端点。这将在幕后使用 DefaultAzureCredential
并允许您使用 Visual Studio、Azure CLI 或其他开发本地资产来对您进行身份验证。 (请参阅:对客户端进行身份验证 和 DefaultAzureCredential)
如果需要,您的生产部署可以继续使用连接字符串形式,或者如果需要,也可以使用具有托管身份或其他凭据类型的身份形式。 (请参阅:使用配置文件创建 Microsoft Entra 凭据类型)