ArgumentNullException при попытке создать KeyVault через Azure Management Fluent Api в функции Azure

Я добавил функцию запуска служебной шины для создания хранилища ключей через Microsoft.Azure. Библиотека Management.Fluent.

Функция работает нормально локально и создает новое хранилище ключей в моей подписке MSDN, однако, когда она развертывается в Azure и пытается создать хранилище ключей в тестовой подписке нашей компании с использованием идентификатора управляемой службы приложения-функции, она терпит неудачу с ArgumentNullException из Guid.Parse.

Трассировка стека

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\1\s\src\Server\CollectorFunctions\Proxies\IKeyVaultProxy.csCollectorFunctions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: 86)

Ошибка возникает при выполнении следующего оператора, взятого из примера ManageKeyVault проект, связанный с этим воспроизведением. Все предоставленные параметры имеют допустимые значения, и группа ресурсов была найдена через IAzure.ResourceGroups.GetByNameAsync (resourceGroupName).

await _azure.Vaults
      .Define(newKeyVaultName)
      .WithRegion(resourceGroup.Region)
      .WithExistingResourceGroup(resourceGroupName)
      .WithEmptyAccessPolicy()
      .CreateAsync();

person Rob Willis    schedule 19.03.2021    source источник
comment
Итак, при локальном запуске ваша личность используется для создания хранилища ключей в подпрограмме. Какое удостоверение используется при работе в Azure? Имеет ли эта личность такие же права, как и вы?   -  person Troy Witthoeft    schedule 19.03.2021
comment
Он использует идентификатор управляемой службы для приложения-функции. Идентификатору изначально была назначена роль участника хранилища ключей в группе ресурсов, затем была повышена роль участника и, наконец, владельца группы ресурсов, но всегда возникала одна и та же ошибка.   -  person Rob Willis    schedule 20.03.2021
comment
Думаю, это такая строка: github.com/Azure/azure-libraries-for-net/blob/, который ищет TenantId, но я не знаю, как его предоставить.   -  person Skrymsli    schedule 24.03.2021


Ответы (1)


В моем случае я не осознавал, что при получении учетных данных есть параметр tenantId. Мне нужно было указать tenantId:

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

Поскольку ваша трассировка стека выглядит точно так же, как моя, я предполагаю, что это проблема. Если вы укажете tenantID при получении учетных данных, я думаю, это должно сработать для вас. Чтобы получить TenantId, перейдите в Azure AD, где находится ваше удостоверение, и оно должно быть указано на странице обзора.

person Skrymsli    schedule 23.03.2021