Я пишу функцию 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.