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

本教程介绍如何配置 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 运行函数,会收到错误。 这是因为没有在本地定义基于标识的连接。 若要在本地运行函数,请像在[上一部分](#connect-to-the service-bus-in-your-function-app)中那样,在 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”以确认,然后选择“删除”。

后续步骤

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

继续学习下一篇文章,了解如何管理标识。