如何使用 Function App identity 访问 Azure Service Bus

How to access Azure Service Bus using Function App identity

我正在按照此处列出的步骤进行操作,但对于 python 代码: https://docs.microsoft.com/en-us/azure/azure-functions/functions-identity-based-connections-tutorial-2

Objective 是创建一个简单的 (hello world) 函数应用程序,该应用程序由 Azure 服务总线消息队列使用基于身份的连接触发。当通过连接字符串引用 ASB 时,函数应用程序工作正常,但在尝试通过函数应用程序的托管服务标识(使用特定配置模式 __fullyQualifiedNamespace)连接时出现此错误。 MSI 已被授予 ASB 上的角色(Azure 服务总线数据接收器)。

Microsoft.Azure.WebJobs.ServiceBus: Microsoft Azure WebJobs SDK ServiceBus connection string 'ServiceBusConnection__fullyQualifiedNamespace' is missing or empty.

函数代码(自动生成)

import logging
import azure.functions as func

def main(msg: func.ServiceBusMessage):
    logging.info('Python ServiceBus queue trigger processed message: %s',
                 msg.get_body().decode('utf-8'))

function.json(连接值根据ms文档修改)

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "msg",
      "type": "serviceBusTrigger",
      "direction": "in",
      "queueName": "erpdemoqueue",
      "connection": "ServiceBusConnection"
    }
  ]
}

host.json(根据ms docs修改的版本)

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[3.3.0, 4.0.0)"
  }
}

要使用托管标识,您需要添加一个设置来标识您的服务总线实例的完全限定命名空间。

例如,在您用于本地开发的 local.settings.json 文件中:

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

或者在 application settings 中为你的函数部署到 Azure 时:

<connection_name>__fullyQualifiedNamespace=<service_bus_namespace>.servicebus.windows.net

这仅在 tutorial that you mentioned. The Microsoft.Azure.WebJobs.Extensions.ServiceBus documentation does covers this a bit better in the Managed identity authentication 部分中简要提及。