如何在 Azure Function 中使用 Azure 托管身份通过触发器访问服务总线?

问题描述 投票:0回答:3

我在 Azure 中创建了一个 ServiceBus 命名空间,以及一个主题和一个订阅。我还有一个简单的 Azure 版本 1 函数,可以触发 ServiceBus 中收到的主题,如下所示:

[FunctionName("MyServiceBusTriggerFunction")]
public static void Run([ServiceBusTrigger("myTopic", "mySubscription", Connection = "MyConnection")]string mySbMsg, TraceWriter log)
{
    log.Info($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
}

当我使用主题的共享访问策略在函数“应用程序设置”中定义连接字符串时,该函数可以很好地触发 ServiceBus 中的主题,如下所示:

Endpoint=sb://MyNamespace.servicebus.windows.net/;SharedAccessKeyName=mypolicy;SharedAccessKey=UZ...E0=

现在,我想使用托管服务身份 (MSI) 来访问 ServiceBus,而不是共享访问密钥。根据这个(https://learn.microsoft.com/en-us/azure/active-directory/managed-service-identity/services-support-msi)应该是可能的,除非我误解了某些东西。不过我还没有成功。

我尝试过的是

  • 在 Azure 门户中将我的函数的托管服务标识设置为“打开”
  • 在 Azure 门户的 ServiceBus 访问控制部分中为该功能授予所有者角色
  • 为 MyFunction 设置连接字符串,如下所示:Endpoint=sb://MyNamespace.servicebus.windows.net/

该功能在此设置中未触发,那么我错过了什么或者我做错了什么? 如果有任何建议可以帮助我走得更远,我将不胜感激。谢谢。

triggers azure-functions azureservicebus azure-managed-identity
3个回答
10
投票

更新

Microsoft.Azure.WebJobs.Extensions.ServiceBus
版本5.x

现在这里有最新版本软件包的官方文档。

{
  "Values": {
    "<connection_name>__fullyQualifiedNamespace": "<service_bus_namespace>.servicebus.windows.net"
  }
}

之前的回答

现在看来这实际上是可能的,至少对我来说效果很好。您需要使用此连接字符串:

Endpoint=sb://service-bus-namespace-name.servicebus.windows.net/;Authentication=ManagedIdentity

我实际上没有在 Microsoft 网站上找到任何有关此内容的文档,而是在博客这里中找到。

Microsoft 确实在此处提供了有关您可以使用的角色以及如何将其限制在范围内的文档。示例:

az role assignment create \
    --role $service_bus_role \
    --assignee $assignee_id \
    --scope /subscriptions/$subscription_id/resourceGroups/$resource_group/providers/Microsoft.ServiceBus/namespaces/$service_bus_namespace/topics/$service_bus_topic/subscriptions/$service_bus_subscription

4
投票

我错过了什么或者我做错了什么?

您可能会混淆 MSI 和共享访问策略。他们使用不同的提供商来访问 Azure ServiceBus。您可以仅使用

ConnectionString
或仅使用 MSI 进行身份验证。

当您使用

Managed Service Identity
(MSI) 进行身份验证时,您需要使用以下代码为托管服务身份创建令牌提供程序。

TokenProvider.CreateManagedServiceIdentityTokenProvider(ServiceAudience.ServiceBusAudience)

TokenProvider 的实现使用

AzureServiceTokenProvider
库中的
Microsoft.Azure.Services.AppAuthentication
AzureServiceTokenProvider
将根据环境采用一系列不同的方法来获取访问令牌。然后初始化客户端来操作ServiceBus。 欲了解更多详情,您可以参考这篇文章

当您使用ServiceBus的ConnectionString访问时,其中使用了

Shared Access Token (SAS)
令牌提供者,因此可以直接操作。


4
投票

同意从azure函数中我们无法直接访问像ASB这样的资源。但是,在本例中,仍然不需要直接在连接字符串中输入密码“SharedAccessKeyName”。 Azure 函数可以与 Azure KeyVault 配合使用。因此,可以将包含敏感信息的连接字符串作为密钥存储在 KeyVault 中,然后通过 KeyVault 授予系统分配的 Azure 函数访问权限的身份,然后将门户中的设置值指定为 @Microsoft.KeyVault(SecretUri={theSecretUri}) 有关如何实现上述目标的详细信息,请参阅以下博客。 https://medium.com/statuscode/getting-key-vault-secrets-in-azure-functions-37620fd20a0b

这仍然可以避免直接在 Azure 函数中指定连接字符串,并通过 Vault 提供单点访问,以便在发生安全漏洞时禁用

© www.soinside.com 2019 - 2024. All rights reserved.