gpt4 book ai didi

c# - 在 Azure Function 中使用 Azure Fluent SDK 时,如何使用托管服务标识创建 azure 对象?

转载 作者:行者123 更新时间:2023-11-30 12:20:10 24 4
gpt4 key购买 nike

我正在编写一个 Azure 函数,它将更新 Azure DNS 区域。该函数附加了一个托管服务身份 (MSI)。

我能够使用非流畅的 SDK 读取 DNS 区域中的当前记录。然而,当我尝试使用流畅的库做同样的事情时,我收到以下错误:

[07/11/2018 14:36:37] Executed 'Function1' (Failed,Id=8d34472e-956a-4ff3-a1b1-16ea6186934a)

[07/11/2018 14:36:37] System.Private.CoreLib: Exception while executing function: Function1.Microsoft.Azure.Management.ResourceManager.Fluent: Value cannot be null.

[07/11/2018 14:36:37] Parameter name: 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}");

}
}
}

这是一个 HTTP 触发的 Azure 函数,允许将订阅、资源组和 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 适当访问权限的帐户。

最佳答案

I am running this locally within Visual Studio which is logged into an account with the appropriate access to Azure.

您的本地计算机上没有管理服务身份,因此您无法在本地使用第一种方法。正如 junnas 所说,您可以将 Azure 服务身份验证扩展AzureServiceTokenProvider 一起使用,它会检索您的帐户以访问 Azure。

更多详情可以引用这个article .

因此,首先您需要转到 yourappname.scm.azurewebsites.net 并选择 Environment 检查是否有 MSI_ENDPOINT 其中的变量。这意味着您已成功设置 MSI。

其次,将函数发布到Azure即可正常运行。

关于c# - 在 Azure Function 中使用 Azure Fluent SDK 时,如何使用托管服务标识创建 azure 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53192345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com