教程:将基于标识的连接(而不是机密)与触发器和绑定一起使用
本教程介绍如何配置 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
运行函数,会收到错误。 这是因为没有在本地定义基于标识的连接。 若要在本地运行函数,请像在[上一部分](#connect-to-the service-bus-in-your-function-app)中那样,在 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”以确认,然后选择“删除”。
后续步骤
在本教程中,你使用基于标识的连接创建了一个函数应用。
继续学习下一篇文章,了解如何管理标识。