При использовании Azure Fluent SDK в функции Azure, как я могу создать объект Azure, используя идентификатор управляемой службы? - PullRequest
0 голосов
/ 07 ноября 2018

Я пишу функцию Azure, которая будет обновлять DNS-зону Azure. К функции прикреплен идентификатор управляемой службы (MSI).

Я могу использовать non-free SDK для чтения текущих записей в зоне DNS. Однако, когда я пытаюсь сделать то же самое с помощью свободно используемых библиотек, я получаю следующую ошибку:

[11.07.2016 14:36:37] Выполнено «Function1» (Failed, Id = 8d34472e-956a-4ff3-a1b1-16ea6186934a)

[11.07.2008 14:36:37] System.Private.CoreLib: Исключительная ситуация при выполнении функции: Function1.Microsoft.Azure.Management.ResourceManager.Fluent: значение не может быть нулевым.

[11.07.2008 14:36:37] Имя параметра: MSI_ENDPOINT.

Чтобы я мог легко проверить разницу между двумя библиотеками, я собрал тестовую функцию.

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Management.ResourceManager.Fluent.Authentication;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Rest;
using Microsoft.Azure.Management.Dns;
using Microsoft.Azure.Management.ResourceManager.Fluent.Core;

namespace UpdateDNS
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "{subscription}/{rg_name}/{zone_name}/{lib}")] HttpRequest req,
            string subscription,
            string rg_name,
            string zone_name,
            string lib,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            int count = 0;
            dynamic records;

            // determine the lib to use to get the dns data
            switch (lib)
            {
                case "fluent":

                    AzureCredentialsFactory factory = new AzureCredentialsFactory();
                    MSILoginInformation msi = new MSILoginInformation(MSIResourceType.AppService);
                    AzureCredentials msiCred = factory.FromMSI(msi, AzureEnvironment.AzureGlobalCloud);
                    var azureAuth = Azure.Configure().WithLogLevel(HttpLoggingDelegatingHandler.Level.BodyAndHeaders).Authenticate(msiCred);

                    // set the subscription to work with
                    var azure = azureAuth.WithSubscription(subscription);

                    var dnszone = azure.DnsZones.GetByResourceGroup(rg_name, zone_name);

                    records = dnszone.ListRecordSets();

                    break;

                default:

                    // get the token from the managed service identity
                    AzureServiceTokenProvider token_provider = new AzureServiceTokenProvider();
                    string token = await token_provider.GetAccessTokenAsync("https://management.azure.com");

                    TokenCredentials token_creds = new TokenCredentials(token);

                    // create the dns client
                    DnsManagementClient client = new DnsManagementClient(token_creds);
                    client.SubscriptionId = subscription;

                    records = client.RecordSets.ListAllByDnsZone(rg_name, zone_name);

                    break;
            }

            foreach (var record in records)
            {
                Console.WriteLine(record.Name);
                count++;
            }

            return new OkObjectResult($"Records: {count}");

        }
    }
}

Это функция Azure, запускаемая по протоколу HTTP и позволяющая передавать подписку, группу ресурсов и зону DNS в качестве параметров, а также использовать библиотеку.

Итак, чтобы проверить не свободно говорящих библиотек, я могу назвать следующее:

http://localhost:7071/api/ee65837a-8b52-4fed-9820-f2eb0bb11baf/my_rg/my_zone/stable

Это вернет что-то вроде:

Records: 3

Тем не менее, если я пытаюсь выполнить тот же запрос, но с использованием свободных библиотек, я получаю ошибку, как показано выше:

http://localhost:7071/api/ee65837a-8b52-4fed-9820-f2eb0bb11baf/my_rg/my_zone/fluent

Я пропускаю параметр, который нужно передать? Я не уверен, где будет установлен 'MSI_ENDPOINT' и как его установить. Я чувствую, что это должно быть сделано для меня.

Версии используемых библиотек:

Microsoft.Azure.Management.DNS 3.0.1

Microsoft.Azure.Management.Fluent 1.17.0

Microsoft.Azure.Services.AppAuthentication 1.0.3

Я запускаю это локально в Visual Studio, которая вошла в учетную запись с соответствующим доступом к Azure.

1 Ответ

0 голосов
/ 08 ноября 2018

Я запускаю это локально в Visual Studio, которая вошла в учетную запись с соответствующим доступом к Azure.

У вас нет локальной службы управления удостоверениями на локальном компьютере, поэтому вы не могли хорошо работать с первым методом на локальном компьютере. Как сказали джунны, вы можете использовать Azure Services Authentication Extension с AzureServiceTokenProvider, который возвращает вашу учетную запись для доступа к Azure.

Для получения более подробной информации вы можете обратиться к этой статье .

Итак, для начала вам нужно пойти к вам yourappname.scm.azurewebsites.net и выбрать Environment, чтобы проверить, есть ли в нем переменная MSI_ENDPOINT. Это означает, что вы успешно настроили MSI.

Во-вторых, опубликуйте функцию в Azure, и она будет работать нормально.

...