使用ListWebAppFunctionKeysArgs获取Azure函数应用API密钥失败求助
问题描述
使用Pulumi的ListWebAppFunctionKeys获取Azure函数应用的API密钥时,返回的Properties值始终为空,无法正确获取密钥。
原问题代码片段:
var json = await result.Content.ReadAsStringAsync(); var root = JsonConvert.DeserializeObject<JsonSupport.AzureFunctionItems.Root>(json); var items = root.value.Select(async v => { var data = await ListWebAppFunctionKeys.InvokeAsync(new ListWebAppFunctionKeysArgs { Name = appName, FunctionName = v.properties.name, ResourceGroupName = resourceGroupName }); return data.Properties; // Property values are null });
解决方案
问题根源
- 错误访问返回字段:Pulumi的
ListWebAppFunctionKeysResult并没有名为Properties的属性,密钥直接作为顶级属性存在(如Default、MasterKey),访问data.Properties自然会得到空值。 - 函数名称获取错误:从Azure Management API返回的函数对象中,函数的唯一标识名称是顶层的
name字段,而非properties.name。 - 异步任务处理不当:使用
Select(async)生成异步任务后,直接调用.Result会导致同步阻塞,可能引发死锁或异常。 - 冗余手动HTTP请求:自行调用Management API处理认证和请求,不如使用Pulumi内置的
GetWebAppFunctions方法可靠。
修正后的代码
using Pulumi; using Pulumi.AzureNative.Web; using Pulumi.AzureNative.Web.Inputs; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; public static class FunctionKeyHelper { public static Output<Dictionary<string, string>> GetFunctionKeys(string resourceGroupName, FunctionApp functionApp) { return functionApp.Name.Apply(async appName => { // 使用Pulumi内置方法获取函数列表,自动处理认证和API版本 var webAppFunctions = await GetWebAppFunctions.InvokeAsync(new GetWebAppFunctionsArgs { Name = appName, ResourceGroupName = resourceGroupName }); // 并行发起所有密钥获取请求 var keyRetrievalTasks = webAppFunctions.Value.Select(async func => { var functionKeys = await ListWebAppFunctionKeys.InvokeAsync(new ListWebAppFunctionKeysArgs { Name = appName, FunctionName = func.Name, // 使用正确的函数名称字段 ResourceGroupName = resourceGroupName }); // 将函数名称与默认密钥配对,可根据需求替换为其他密钥(如MasterKey) return new KeyValuePair<string, string>(func.Name, functionKeys.Default!); }); // 等待所有异步任务完成,避免同步阻塞 var keyPairs = await Task.WhenAll(keyRetrievalTasks); // 转换为字典返回 return keyPairs.ToDictionary(kv => kv.Key, kv => kv.Value); }); } }
关键说明
- 使用Pulumi内置方法:
GetWebAppFunctions替代手动HTTP请求,无需自行处理Bearer令牌和API版本,减少出错概率。 - 正确访问密钥字段:直接使用
functionKeys.Default或functionKeys.MasterKey获取对应密钥,而非不存在的Properties属性。 - 异步任务正确处理:通过
Task.WhenAll并行处理所有密钥获取请求,提升效率并避免同步阻塞问题。 - 正确传递函数名称:使用函数对象的顶层
Name字段作为FunctionName参数,确保API调用目标正确。
内容的提问来源于stack exchange,提问作者Scott Nimrod
相关产品推荐
相关产品推荐

