尝试通过 Azure Function 中的 Azure Management Fluent Api 创建 KeyVault 时出现 ArgumentNullException

ArgumentNullException when attempting to create KeyVault via Azure Management Fluent Api in Azure Function

我添加了一个服务总线触发函数,通过 Microsoft.Azure.Management.Fluent 库创建一个密钥库。

该函数在本地运行良好,并在我的 MSDN 订阅中创建了一个新的密钥保管库,但是,当它部署到 Azure 中并尝试使用函数应用托管服务标识在我们公司的测试订阅中创建一个密钥保管库时,它失败了来自 Guid.Parse.

ArgumentNullException

堆栈跟踪

Inner exception System.ArgumentNullException handled at CollectorFunctions.Proxies.KeyVaultProxy+d__9.MoveNext:
at System.Guid.Parse (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)
at Microsoft.Azure.Management.KeyVault.Fluent.VaultsImpl.WrapModel (Microsoft.Azure.Management.KeyVault.Fluent, Version=1.0.0.68, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at Microsoft.Azure.Management.KeyVault.Fluent.VaultsImpl.Define (Microsoft.Azure.Management.KeyVault.Fluent, Version=1.0.0.68, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at Microsoft.Azure.Management.KeyVault.Fluent.VaultsImpl.Microsoft.Azure.Management.ResourceManager.Fluent.Core.CollectionActions.ISupportsCreating<Microsoft.Azure.Management.KeyVault.Fluent.Vault.Definition.IBlank>.Define (Microsoft.Azure.Management.KeyVault.Fluent, Version=1.0.0.68, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at CollectorFunctions.Proxies.KeyVaultProxy+d__9.MoveNext (CollectorFunctions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nullCollectorFunctions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: D:\a\s\src\Server\CollectorFunctions\Proxies\IKeyVaultProxy.csCollectorFunctions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 86)

错误发生 运行 以下语句取自 ManageKeyVault sample project 链接自此重现。提供的参数都具有有效值,并且通过 IAzure.ResourceGroups.GetByNameAsync(resourceGroupName).

查找了资源组
await _azure.Vaults
      .Define(newKeyVaultName)
      .WithRegion(resourceGroup.Region)
      .WithExistingResourceGroup(resourceGroupName)
      .WithEmptyAccessPolicy()
      .CreateAsync();

就我而言,我在获取凭据时没有意识到有 tenantId 参数。我需要提供 tenantId:

var msi = new MSILoginInformation(MSIResourceType.VirtualMachine);
var creds = SdkContext.AzureCredentialsFactory.FromMSI(msi,
 AzureEnvironment.AzureGlobalCloud, 
*** tenantId ***);

因为你的堆栈跟踪看起来和我的一模一样,我猜这就是问题所在。如果您在获取凭据时指定 tenantID,那么我认为它应该适合您。要获取 TenantId,请转到您的身份所在的 Azure AD,它应该列在概览页面上。