教程:将基于标识的连接(而不是机密)与触发器和绑定一起使用
本教程介绍如何配置 Azure Functions 以使用托管标识连接到 Azure 服务总线队列,而不是使用存储在函数应用设置中的机密。 本教程是创建其定义中没有默认存储机密的函数应用教程的延续。 若要详细了解基于标识的连接,请参阅配置基于标识的连接。
虽然显示的过程通常适用于所有语言,但本教程目前专用于支持 Windows 上的 C# 类库函数。
本教程介绍以下操作:
- 创建服务总线命名空间和队列。
- 使用托管标识配置函数应用
- 创建一个角色分配,授予该标识从服务总线队列读取的权限
- 使用服务总线触发器创建和部署函数应用。
- 验证与服务总线的基于标识的连接
先决条件
完成上一教程:使用基于标识的连接创建函数应用。
创建服务总线和队列
在 Azure 门户中,选择“创建资源(+)”。
在“创建资源”页上,选择“集成”>“服务总线” 。
在“基本信息”页上,使用下表配置服务总线命名空间设置。 其余选项使用默认值。
选项 建议的值 描述 订阅 订阅 要在其下创建资源的订阅。 资源组 myResourceGroup 用函数应用创建的资源组。 命名空间名称 全局唯一名称 从中触发函数的实例的命名空间。 由于命名空间可公开访问,因此必须使用在 Azure 中全局唯一的名称。 该名称的长度还必须在 6 到 50 个字符之间,仅包含字母数字字符和短划线,并且不能以数字开头。 位置 myFunctionRegion 创建函数应用的区域。 定价层 基本 基本服务总线层。 选择“查看 + 创建”。 通过验证后,选择“创建”。
部署完成后,选择“转到资源”。
在新的服务总线命名空间中,选择“+ 队列”以添加队列。
输入
myinputqueue
作为新队列的名称,然后选择“创建”。
现在,你有了一个队列,你将向函数应用的托管标识添加角色分配。
使用托管标识配置服务总线触发器
若要将服务总线触发器与基于标识的连接一起使用,需要将“Azure 服务总线数据接收方”角色分配添加到函数应用中的托管标识。 使用托管标识触发服务总线命名空间时需要此角色。 还可以将自己的帐户添加到此角色,从而可以在本地测试期间连接到服务总线命名空间。
注意
使用基于标识的连接的角色要求因服务及其连接方式而异。 需求因触发器、输入绑定和输出绑定而异。 有关特定角色要求的更多详细信息,请参阅服务的触发器和绑定文档。
在刚刚创建的服务总线命名空间中,选择“访问控制(IAM)”。 可以在此处查看和配置有权访问资源的人员。
单击“添加”,然后选择“添加角色分配” 。
搜索“Azure 服务总线数据接收方”,将其选中,然后单击“下一步” 。
在“成员”选项卡上的“将访问权限分配给”下,选择“托管标识”
单击“选择成员”以打开“选择托管标识”面板 。
确认“订阅”是之前在其中创建资源的那个订阅。
在“托管标识”选择器中,从“系统分配的托管标识”类别中选择“函数应用” 。 “函数应用”标签旁边可能有一个用括号括起来的数字,表示订阅中具有系统分配标识的应用数量。
你的应用程序应显示在输入字段下的列表中。 如果没有看到它,可以使用“选择”框筛选具有你的应用名称的结果。
单击你的应用程序。 它应该向下移动到“所选成员”部分。 单击“选择” 。
返回“添加角色分配”屏幕,单击“查看 + 分配” 。 检查配置,然后单击“查看 + 分配”。
你已使用托管标识向函数应用授予对服务总线命名空间的访问权限。
在函数应用中连接到服务总线
在门户中,搜索在上一教程中创建的函数应用,或在“函数应用”页面中浏览到它。
在函数应用的“设置”下选择“配置” 。
在“应用程序设置”中,选择“+ 新建应用程序设置”以创建下表中的新设置 。
名称 值 说明 ServiceBusConnection__fullyQualifiedNamespace <SERVICE_BUS_NAMESPACE>.servicebus.chinacloudapi.cn 此设置使用基于标识的连接(而不是机密)将函数应用连接到服务总线。 创建这两个设置后,选择“保存”>“确认” 。
注意
使用 Azure 应用程序配置或 Key Vault 为托管标识连接提供设置时,设置名称应使用有效的键分隔符(例如 :
或 /
)替代 __
,以确保正确解析名称。
例如 ServiceBusConnection:fullyQualifiedNamespace
。
准备好函数应用以使用托管标识连接到服务总线命名空间后,可以向本地项目添加一个使用服务总线触发器的新函数。
添加服务总线触发函数
按如下所示运行
func init
命令,在名为 LocalFunctionProj 的文件夹中创建使用指定运行时的函数项目:func init LocalFunctionProj --dotnet
导航到项目文件夹:
cd LocalFunctionProj
在根项目文件夹中,运行以下命令:
dotnet add package Microsoft.Azure.WebJobs.Extensions.ServiceBus --version 5.2.0
这会将服务总线扩展包的默认版本替换为支持托管标识的版本。
运行以下命令,将服务总线触发函数添加到项目中:
func new --name ServiceBusTrigger --template ServiceBusQueueTrigger
这将添加新服务总线触发器的代码和对扩展包的引用。 需要为此触发器添加服务总线命名空间连接设置。
打开新的 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
。
发布更新的项目
运行以下命令以在本地生成部署包所需的文件:
dotnet publish --configuration Release
浏览至
\bin\Release\netcoreapp3.1\publish
子文件夹,并将其内容创建为一个 .zip 文件。通过运行以下命令发布该 .zip 文件,并根据需要替换
FUNCTION_APP_NAME
、RESOURCE_GROUP_NAME
和PATH_TO_ZIP
参数:az functionapp deploy -n FUNCTION_APP_NAME -g RESOURCE_GROUP_NAME --src-path PATH_TO_ZIP
现在你已使用新触发器更新了函数应用,可以使用标识验证它是否正常工作。
验证更改
在门户中,搜索
Application Insights
并选择“服务”下的“Application Insights” 。在“Application Insights”中,浏览或搜索你的命名实例。
在实例中,选择“调查”下的“实时指标” 。
保持上一个选项卡打开,然后在新选项卡中打开 Azure 门户。在新选项卡中,导航到你的服务总线命名空间,从左侧边栏选项卡中选择“队列”。
选择名为
myinputqueue
的队列。在左侧边栏选项卡中,选择“Service Bus Explorer”。
发送测试消息。
选择打开的“实时指标”选项卡,并查看服务总线队列执行情况。
祝贺你! 你已成功使用托管标识设置服务总线队列触发器!
清理资源
在前面的步骤中,你在资源组中创建了 Azure 资源。 如果将来不再需要这些资源,可以通过删除资源组来删除它们。
从 Azure 门户菜单或“主页”页上,选择“资源组” 。 然后,在“资源组”页上,选择“myResourceGroup” 。
在“myResourceGroup”页中,确保列出的资源是要删除的资源。
选择“删除资源组” ,在文本框中键入“myResourceGroup” 以确认,然后选择“删除” 。
后续步骤
在本教程中,你使用基于标识的连接创建了一个函数应用。
使用以下链接了解更多具有基于标识的连接的 Azure Functions: