你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

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

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

In this tutorial, you learn how to:

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

先决条件

创建服务总线命名空间和队列

  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.windows.net 此设置使用基于标识的连接(而不是机密)将函数应用连接到服务总线。
  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”以确认,然后选择“删除”

Next steps

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

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