教程:将基于标识的连接(而不是机密)与触发器和绑定一起使用

本教程介绍如何配置 Azure Functions 以使用托管标识连接到 Azure 服务总线队列,而不是使用存储在函数应用设置中的机密。 本教程是创建其定义中没有默认存储机密的函数应用教程的延续。 若要详细了解基于标识的连接,请参阅配置基于标识的连接

虽然显示的过程通常适用于所有语言,但本教程目前专用于支持 Windows 上的 C# 类库函数。

本教程介绍以下操作:

  • 创建服务总线命名空间和队列。
  • 使用托管标识配置函数应用
  • 创建一个角色分配,授予该标识从服务总线队列读取的权限
  • 使用服务总线触发器创建和部署函数应用。
  • 验证与服务总线的基于标识的连接

先决条件

完成上一教程:使用基于标识的连接创建函数应用

创建服务总线和队列

  1. Azure 门户中,选择“创建资源(+)”。

  2. 在“创建资源”页上,选择“集成”>“服务总线” 。

  3. 在“基本信息”页上,使用下表配置服务总线命名空间设置。 其余选项使用默认值。

    选项 建议的值 描述
    订阅 订阅 要在其下创建资源的订阅。
    资源组 myResourceGroup 用函数应用创建的资源组。
    命名空间名称 全局唯一名称 从中触发函数的实例的命名空间。 由于命名空间可公开访问,因此必须使用在 Azure 中全局唯一的名称。 该名称的长度还必须在 6 到 50 个字符之间,仅包含字母数字字符和短划线,并且不能以数字开头。
    位置 myFunctionRegion 创建函数应用的区域。
    定价层 基本 基本服务总线层。
  4. 选择“查看 + 创建”。 通过验证后,选择“创建”。

  5. 部署完成后,选择“转到资源”。

  6. 在新的服务总线命名空间中,选择“+ 队列”以添加队列。

  7. 输入 myinputqueue 作为新队列的名称,然后选择“创建”。

现在,你有了一个队列,你将向函数应用的托管标识添加角色分配。

使用托管标识配置服务总线触发器

若要将服务总线触发器与基于标识的连接一起使用,需要将“Azure 服务总线数据接收方”角色分配添加到函数应用中的托管标识。 使用托管标识触发服务总线命名空间时需要此角色。 还可以将自己的帐户添加到此角色,从而可以在本地测试期间连接到服务总线命名空间。

注意

使用基于标识的连接的角色要求因服务及其连接方式而异。 需求因触发器、输入绑定和输出绑定而异。 有关特定角色要求的更多详细信息,请参阅服务的触发器和绑定文档。

  1. 在刚刚创建的服务总线命名空间中,选择“访问控制(IAM)”。 可以在此处查看和配置有权访问资源的人员。

  2. 单击“添加”,然后选择“添加角色分配” 。

  3. 搜索“Azure 服务总线数据接收方”,将其选中,然后单击“下一步” 。

  4. 在“成员”选项卡上的“将访问权限分配给”下,选择“托管标识”

  5. 单击“选择成员”以打开“选择托管标识”面板 。

  6. 确认“订阅”是之前在其中创建资源的那个订阅。

  7. 在“托管标识”选择器中,从“系统分配的托管标识”类别中选择“函数应用” 。 “函数应用”标签旁边可能有一个用括号括起来的数字,表示订阅中具有系统分配标识的应用数量。

  8. 你的应用程序应显示在输入字段下的列表中。 如果没有看到它,可以使用“选择”框筛选具有你的应用名称的结果。

  9. 单击你的应用程序。 它应该向下移动到“所选成员”部分。 单击“选择” 。

  10. 返回“添加角色分配”屏幕,单击“查看 + 分配” 。 检查配置,然后单击“查看 + 分配”。

你已使用托管标识向函数应用授予对服务总线命名空间的访问权限。

在函数应用中连接到服务总线

  1. 在门户中,搜索在上一教程中创建的函数应用,或在“函数应用”页面中浏览到它。

  2. 在函数应用的“设置”下选择“配置” 。

  3. 在“应用程序设置”中,选择“+ 新建应用程序设置”以创建下表中的新设置 。

    名称 说明
    ServiceBusConnection__fullyQualifiedNamespace <SERVICE_BUS_NAMESPACE>.servicebus.chinacloudapi.cn 此设置使用基于标识的连接(而不是机密)将函数应用连接到服务总线。
  4. 创建这两个设置后,选择“保存”>“确认” 。

注意

使用 Azure 应用程序配置Key Vault 为托管标识连接提供设置时,设置名称应使用有效的键分隔符(例如 :/)替代 __,以确保正确解析名称。

例如 ServiceBusConnection:fullyQualifiedNamespace

准备好函数应用以使用托管标识连接到服务总线命名空间后,可以向本地项目添加一个使用服务总线触发器的新函数。

添加服务总线触发函数

  1. 按如下所示运行 func init 命令,在名为 LocalFunctionProj 的文件夹中创建使用指定运行时的函数项目:

    func init LocalFunctionProj --dotnet
    
  2. 导航到项目文件夹:

    cd LocalFunctionProj
    
  3. 在根项目文件夹中,运行以下命令:

    dotnet add package Microsoft.Azure.WebJobs.Extensions.ServiceBus --version 5.2.0
    

    这会将服务总线扩展包的默认版本替换为支持托管标识的版本。

  4. 运行以下命令,将服务总线触发函数添加到项目中:

    func new --name ServiceBusTrigger --template ServiceBusQueueTrigger 
    

    这将添加新服务总线触发器的代码和对扩展包的引用。 需要为此触发器添加服务总线命名空间连接设置。

  5. 打开新的 ServiceBusTrigger.cs 项目文件,将 ServiceBusTrigger 类替换为以下代码:

    public static class ServiceBusTrigger
    {
        [FunctionName("ServiceBusTrigger")]
        public static void Run([ServiceBusTrigger("myinputqueue", 
            Connection = "ServiceBusConnection")]string myQueueItem, ILogger log)
        {
            log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
        }
    }
    

    此代码示例将队列名称更新为 myinputqueue,该名称与之前创建的队列名称相同。 它还将服务总线连接的名称设置为 ServiceBusConnection。 该名称是你在门户中配置的基于标识的连接 ServiceBusConnection__fullyQualifiedNamespace 使用的服务总线命名空间。

注意

如果现在尝试使用 func start 运行函数,将收到错误消息。 这是因为没有在本地定义基于标识的连接。 如果要在本地运行函数,请像在上一部分中所做的那样在 local.settings.json 中设置应用设置 ServiceBusConnection__fullyQualifiedNamespace。 此外,需要将角色分配给开发人员标识。 有关更多详细信息,请参阅有关使用基于标识的连接进行本地开发的文档

注意

使用 Azure 应用程序配置Key Vault 为托管标识连接提供设置时,设置名称应使用有效的键分隔符(例如 :/)替代 __,以确保正确解析名称。

例如 ServiceBusConnection:fullyQualifiedNamespace

发布更新的项目

  1. 运行以下命令以在本地生成部署包所需的文件:

    dotnet publish --configuration Release
    
  2. 浏览至 \bin\Release\netcoreapp3.1\publish 子文件夹,并将其内容创建为一个 .zip 文件。

  3. 通过运行以下命令发布该 .zip 文件,并根据需要替换 FUNCTION_APP_NAMERESOURCE_GROUP_NAMEPATH_TO_ZIP 参数:

    az functionapp deploy -n FUNCTION_APP_NAME -g RESOURCE_GROUP_NAME --src-path PATH_TO_ZIP
    

现在你已使用新触发器更新了函数应用,可以使用标识验证它是否正常工作。

验证更改

  1. 在门户中,搜索 Application Insights 并选择“服务”下的“Application Insights” 。

  2. 在“Application Insights”中,浏览或搜索你的命名实例。

  3. 在实例中,选择“调查”下的“实时指标” 。

  4. 保持上一个选项卡打开,然后在新选项卡中打开 Azure 门户。在新选项卡中,导航到你的服务总线命名空间,从左侧边栏选项卡中选择“队列”。

  5. 选择名为 myinputqueue 的队列。

  6. 在左侧边栏选项卡中,选择“Service Bus Explorer”。

  7. 发送测试消息。

  8. 选择打开的“实时指标”选项卡,并查看服务总线队列执行情况。

祝贺你! 你已成功使用托管标识设置服务总线队列触发器!

清理资源

在前面的步骤中,你在资源组中创建了 Azure 资源。 如果将来不再需要这些资源,可以通过删除资源组来删除它们。

从 Azure 门户菜单或“主页”页上,选择“资源组” 。 然后,在“资源组”页上,选择“myResourceGroup” 。

在“myResourceGroup”页中,确保列出的资源是要删除的资源。

选择“删除资源组” ,在文本框中键入“myResourceGroup” 以确认,然后选择“删除” 。

后续步骤

在本教程中,你使用基于标识的连接创建了一个函数应用。

使用以下链接了解更多具有基于标识的连接的 Azure Functions: