教程:使用专用终结点将 Azure Functions 与 Azure 虚拟网络集成

本教程介绍如何使用专用终结点将 Azure Functions 连接到 Azure 虚拟网络中的资源。 你使用 Azure 门户创建了一个新的函数应用,并使用了一个受虚拟网络限制的新存储帐户。 虚拟网络使用服务总线队列触发器。

在本教程中,你将:

  • 在弹性高级计划中创建具有虚拟网络集成和专用终结点的函数应用。
  • 创建 Azure 资源,例如服务总线
  • 将服务总线锁在专用终结点后。
  • 部署使用服务总线和 HTTP 触发器的函数应用。
  • 测试函数应用在虚拟网络中是否安全。
  • 清理资源。

在高级计划中创建函数应用。

弹性高级计划中创建 C# 函数应用,该应用支持网络功能,例如创建时的虚拟网络集成以及无服务器缩放。 本教程使用 C# 和 Windows。 也支持其他语言和 Linux。

  1. 在 Azure 门户菜单上或在门户“主页”中,选择“创建资源”。

  2. “新建 ”页上,选择 “Web>函数应用”。

  3. 在“托管选项”页上,选择 “Functions Premium”。

  4. 在“基本信息”页面,使用下表配置函数应用设置。

    设置 建议值 DESCRIPTION
    订阅 你的订阅 创建此新函数应用的订阅。
    资源组 我的资源组 要在其中创建函数应用的新资源组的名称。
    函数应用名称 全局唯一名称 用于标识您的新函数应用程序的名称。 有效字符为 a-z(不区分大小写)、0-9-
    发布 Code 选择发布代码文件或 Docker 容器。
    运行时堆栈 .NET 本教程使用 .NET。
    版本 8 (LTS),隔离工作者模型 本教程使用在 isolated worker model 中运行的 .NET 8.0。
    区域 首选区域 选择离你近或离函数访问的其他服务近的区域
    操作系统 Windows操作系统 本教程使用 Windows,但也适用于 Linux。
    计划 函数高级版 定义如何将资源分配给函数应用的托管计划。 默认情况下,选择“高级”时,将创建一个新的应用服务计划。 默认的 SKU 和大小EP1,其中 EP 表示 高级弹性。 有关详细信息,请参阅高级 SKU 的列表。

    在高级计划上运行 JavaScript 函数时,选择 vCPU 数更少的实例。 有关详细信息,请参阅选择单核心高级计划
  5. 在“托管”页上,输入以下设置。

    设置 建议值 DESCRIPTION
    存储帐户 全局唯一名称 创建函数应用使用的存储帐户。 存储帐户名称的长度必须为 3 到 24 个字符。 它们可能包含数字和小写字母。 也可使用不受防火墙规则限制,并且满足存储帐户要求的现有帐户。 将 Functions 与锁定的存储帐户一起使用时,需要 v2 存储帐户。 此版本是在通过 Azure 门户创建具有网络功能的函数应用时创建的默认存储版本。
  6. 在“网络”页上,输入以下设置。

    注释

    在选择其他选项之前,其中一些设置是不可见的。

    设置 建议值 DESCRIPTION
    启用公共访问 关闭 拒绝公用网络访问会阻止除来自专用终结点之外的所有传入流量。
    启用网络注入 在创建时,将此选项切换到“打开”后,具有虚拟网络集成功能的应用程序配置选项会显示在门户窗口中。
    虚拟网络 新建 选择“新建”字段。 在弹出屏幕中,提供虚拟网络的名称,然后选择“确定”。 在创建函数应用程序时,将显示用于限制入站和出站访问的选项。 必须在窗口的 “出站访问 ”部分中显式启用虚拟网络集成,以限制出站访问。

    为“入站访问”部分输入以下设置。 此步骤会在函数应用上创建专用终结点。

    小窍门

    若要从 Azure 门户继续与函数应用交互,需要将本地计算机添加到虚拟网络。 如果不希望限制入站访问,可跳过此步骤。

    设置 建议值 DESCRIPTION
    启用专用终结点 启用此选项后,门户中会显示在创建时使用虚拟网络集成配置应用程序的功能。
    专用终结点名称 我的入站私人终端名称 用于标识新函数应用专用终结点的名称。
    入站子网 新建 此选项可为入站专用终结点创建新的子网。 可将多个专用终结点添加到单一子网。 提供子网名称子网地址块可能保留默认值。 选择“确定”。 要详细了解如何调整子网大小,请参阅子网
    DNS Azure 专用 DNS 区域 此值指示专用终结点所使用的 DNS 服务器。 在大多数情况下,如果在 Azure 中工作,则 Azure 专用 DNS 区域是应使用的 DNS 区域,因为对自定义 DNS 区域使用手动会增加复杂性。

    为“出站访问”部分输入以下设置。 此步骤会在创建时将函数应用与虚拟网络集成。 它还公开了在存储帐户上创建专用终结点的选项,并在创建时限制存储帐户进行网络访问。 当函数应用集成虚拟网络时,默认情况下,所有出站流量都会 通过虚拟网络

    设置 建议值 DESCRIPTION
    启用 VNet 集成 此设置在创建时将函数应用程序与虚拟网络集成,并通过虚拟网络定向所有出站流量。
    出站子网 新建 此设置为函数应用的虚拟网络集成创建新的子网。 函数应用只能与空子网进行虚拟网络集成。 提供子网名称子网地址块可能保留默认值。 选择“确定”。 将会显示用于创建存储专用终结点的选项。 要在虚拟网络中使用函数应用,需要将其加入子网。

    为“存储专用终结点”部分输入以下设置。 此步骤会在创建时为存储帐户上的 blob、队列、文件和表终结点创建专用终结点。 此方法有效地将存储帐户与虚拟网络集成。

    设置 建议值 DESCRIPTION
    添加存储专用终结点 启用此选项后,将在门户中显示在创建时使用虚拟网络集成配置应用程序的功能。
    专用终结点名称 我的入站私人终端名称 用于标识存储帐户专用终结点的名称。
    专用终结点子网 新建 此设置为存储帐户上的入站专用终结点创建新的子网。 可将多个专用终结点添加到单一子网。 提供子网名称子网地址块可能保留默认值。 选择“确定”。
    DNS Azure 专用 DNS 区域 此值指示专用终结点所使用的 DNS 服务器。 在大多数情况下,如果在 Azure 中工作,则 Azure 专用 DNS 区域是应使用的 DNS 区域,因为对自定义 DNS 区域使用手动将会增加复杂性。
  7. 在“监控”页面上,输入以下设置。

    设置 建议值 DESCRIPTION
    Application Insights 违约 在最近的受支持的区域中,创建一个具有相同应用名称的 Application Insights 资源。 如果需要更改新资源名称或将数据存储在 Azure 地理位置的其他位置,请展开此设置。
  8. “高级 ”页上,启用以下设置。

    设置 建议值 DESCRIPTION
    系统分配的标识 为函数应用启用系统分配的托管标识,稍后可以使用该标识连接到不带连接字符串的服务总线。
  9. 选择“查看 + 创建”,以便查看应用配置选择。

  10. 在“查看 + 创建”页面查看设置。 然后,选择“创建”以创建和部署函数应用。

  11. 在门户右上角,选择“通知”图标,留意是否显示了“部署成功”消息。

  12. 选择转到资源以查看您的新函数应用程序。 还可选择“固定到仪表板”。 固定可以更轻松地从仪表板返回此函数应用资源。

创建和部署应用时,请记住以下注意事项:

  • 在门户中使用配置了专用终结点的存储帐户创建高级计划函数应用时,门户会自动将 vnetContentShareEnabled 站点属性设置为 true。 此属性可确保流向Azure 文件存储内容共享的流量(用于横向扩展高级计划应用)通过虚拟网络进行路由。 有关详细信息,请参阅 vnetContentShareEnabled 站点属性参考。 对于自动部署,必须在部署模板中显式设置此站点属性。 有关详细信息,请参阅安全部署

  • 某些部署有时可能无法在存储帐户中创建专用终结点,并出现错误 StorageAccountOperationInProgress。 即使成功创建函数应用本身,也会发生此失败。 在遇到此类错误时,请删除函数应用并重试操作。 也可以选择在存储帐户上手动创建专用端点。

创建服务总线

接下来,创建一个服务总线实例,以将其用于测试本教程中函数应用的网络功能。

  1. 在 Azure 门户菜单上或在门户“主页”中,选择“创建资源”。

  2. 在“新建”页面,搜索“服务总线”。 然后选择 创建

  3. 在“基本信息”选项卡上,使用下表配置服务总线设置。 所有其他设置都可以使用默认值。

    设置 建议值 DESCRIPTION
    订阅 你的订阅 创建资源所在的订阅。
    资源组 我的资源组 用函数应用创建的资源组。
    命名空间名称 myServiceBus 启用专用终结点的服务总线实例的名称。
    位置 我的功能区域 创建函数应用的区域。
    定价层 高级 选择此层将专用终结点与 Azure 服务总线一起使用。
  4. 选择“查看 + 创建”。 通过验证后,选择“创建”。

锁定服务总线

创建专用终结点以锁定服务总线:

  1. 在新服务总线中,在Settings下的菜单中,选择Networking

  2. 在“专用终结点连接”选项卡上,选择“专用终结点”。

    如何转到服务总线专用终结点的屏幕截图。

  3. 在“基本信息”选项卡上,使用下表中显示的私有终结点设置。

    设置 建议值 DESCRIPTION
    订阅 你的订阅 创建资源所在的订阅。
    资源组 我的资源组 用函数应用创建的资源组。
    名称 sb端点 服务总线的专用终结点名称。
    区域 我的功能区域 创建存储帐户的区域。
  4. 在“资源”选项卡上,使用下表中显示的专用终结点设置。

    设置 建议值 DESCRIPTION
    订阅 你的订阅 创建您的资源所依据的订阅。
    资源类型 Microsoft.ServiceBus/namespaces 服务总线的资源类型。
    资源 myServiceBus 在本教程前面创建的服务总线。
    目标子资源 命名空间 服务总线中用于命名空间的专用终结点。
  5. 虚拟网络 选项卡上,对于 Subnet 设置,选择创建的入站子网。

  6. DNS标记 保留为默认值,然后选择“ 查看 + 创建”。 通过验证后,选择“创建”。

  7. 创建专用终结点后,返回到服务总线命名空间的“网络”部分,检查“公共访问”选项卡。

  8. 确保已选择“所选网络”。

  9. 选择“+添加现有虚拟网络”,添加最近创建的虚拟网络。

  10. 在“添加网络”选项卡上,使用下表中的网络设置:

    设置 建议值 DESCRIPTION
    订阅 你的订阅 创建您的资源所依据的订阅。
    虚拟网络 myVirtualNet 函数应用将连接到的虚拟网络的名称。
    子网 功能 函数应用将连接到的子网的名称。
  11. 选择“添加客户端 IP 地址”,为当前客户端 IP 授予对命名空间的访问权限。

    注释

    必须允许你的客户端 IP 地址,这样 Azure 门户才能在本教程的后续部分将消息发布到队列中

  12. 选择“启用”以启用服务终结点。

  13. 选择“添加”,将所选虚拟网络和子网添加到服务总线的防火墙规则中。

  14. 选择“保存”以保存更新的防火墙规则。

虚拟网络中的资源现可使用专用终结点与服务总线进行通信。

创建队列

创建你的 Azure Functions 服务总线 触发器用于获取事件的队列:

  1. 在 服务总线 中,在 Entities 下的菜单中,选择 Queues

  2. 选择队列。 在本教程中,请将新的队列命名为queue

    如何创建服务总线队列的截图。

  3. 选择 创建

授予函数应用对服务总线的访问权限

由于在创建应用期间启用了系统分配的托管标识,因此现在可以使用基于角色的访问控制(RBAC)向函数应用授予对服务总线的访问权限。

  1. 在 服务总线 命名空间中,选择 访问控制 (IAM)

  2. 选择添加>添加角色分配

  3. 搜索 Azure 服务总线 数据接收器,选择角色,然后选择 Next

  4. 在“ 成员 ”选项卡上,对于 “分配访问权限”,请选择 “托管标识”。

  5. 选择 “+ 选择成员”,找到并选择函数应用的托管标识,然后选择“ 选择”。

  6. 选择“查看 + 分配”以完成角色分配。

有关基于标识的连接的详细信息,请参阅 服务总线 绑定参考文章中的 基于标识的连接

配置函数应用设置

  1. 在函数应用中,在 “设置”下的菜单中,选择 “环境变量”。

  2. 若要使用托管标识将函数应用连接到服务总线,需要添加服务总线命名空间设置。 选择 + 添加 来创建一个名为 SERVICEBUS_CONNECTION__fullyQualifiedNamespace 的新设置,其值为 <SERVICE_BUS_NAMESPACE>.servicebus.chinacloudapi.cn,将 <SERVICE_BUS_NAMESPACE> 替换为您的 服务总线 命名空间的名称。 完成后,选择应用

  3. 由于使用的是高级弹性托管计划,请在“环境变量”视图中,选择“应用设置”选项卡。验证FUNCTIONS_WORKER_RUNTIME设置是否具有dotnet-isolated的值。 然后选择 “函数运行时设置 ”选项卡。将 运行时规模监视 设置为 “打开”。 然后,选择应用。 运行时驱动的缩放使你能够将非 HTTP 触发器函数连接到在虚拟网络中运行的各项服务。

    介绍如何为 Azure Functions 启用运行时驱动的缩放的屏幕截图。

注释

托管在专用应用服务计划中的函数应用不需要运行时缩放。

部署服务总线触发器和 HTTP 触发器

重要

由于已禁用公共访问,因此无法访问 SCM 部署站点。 必须暂时重新启用公共访问,以便部署中心可以部署代码。 对于生产工作负荷,请从部署到虚拟网络上的子网的 自承载 代理进行部署,或使用 点到站点 VPN 连接开发计算机。 有关详细信息,请参阅 安全虚拟网络

  1. 在函数应用中的 “设置”下的菜单中,选择“ 网络”。 将 公用网络访问权限 设置为 “从选择虚拟网络和 IP 地址启用”,然后选择“ 保存”。

  2. 在 GitHub 中,转到以下示例存储库。 它包含一个函数应用,还包含两个函数、一个 HTTP 触发器和一个服务总线队列触发器。

    https://github.com/Azure-Samples/functions-vnet-tutorial

  3. 在页面顶部选择“分支”,以在自己的 GitHub 帐户或组织中创建此存储库的分支。

  4. 在函数应用中,在 “部署”下的菜单中,选择 “部署中心”。 然后选择“设置”。

  5. 在“设置”选项卡上,使用下表中显示的部署设置。

    设置 建议值 DESCRIPTION
    来源 GitHub 应该已为步骤 2 中的示例代码创建了 GitHub 存储库。
    组织 我的组织 已存储库所在的组织。 通常是你的帐户。
    存储库 functions-vnet-tutorial 存储库分叉从此处
    分支 主要 创建的存储库的主分支。
    运行时堆栈 .NET 示例代码是用 C# 编写的。
    版本 .NET 8 独立 运行时版本。
  6. 选择“保存”

    介绍如何通过门户部署 Azure Functions 代码的屏幕截图。

  7. 初始部署可能需要几分钟。 成功部署应用后,在“日志”选项卡上,可以看到“成功(活动)”状态消息。 如有必要,请刷新页面。

  8. 完成部署后,重新保护应用。 在函数应用中,转到“设置>”,并将公共网络访问设置回“已禁用”。 选择“保存”

祝贺! 已成功部署示例函数应用。

测试已锁定的函数应用程序

由于函数应用已禁用公共访问,因此无法从公共 Internet 调用 HTTP 触发器终结点。 而是通过发送消息并在 Application Insights 中监视函数的执行情况来验证 服务总线 队列触发器。

  1. 在函数应用中的 “监视”下的菜单中,选择 “Application Insights”。 选择 “应用”,然后选择 “查看 Application Insights 数据”

    查看函数应用的应用洞察的屏幕截图。

  2. 在“ 调查”下的菜单中,选择 “实时指标”。

  3. 打开新选项卡。在 服务总线 中,在 Entities 下的菜单中,选择 Queues

  4. 选择您的队列。

  5. 在菜单中,选择服务总线资源管理器。 选择 “发送消息”,对于 “内容类型 ”,请选择 “文本/纯”。 然后输入一条消息。

  6. 选择“发送”发送该消息。

    展示如何使用门户发送服务总线消息的屏幕截图。

  7. 在“ 实时指标 ”选项卡上,应会看到服务总线队列触发器已触发。 如果尚未触发,请通过“服务总线 Explorer”重新发送消息。

    函数应用中利用实时指标查看消息的屏幕截图。

祝贺! 您已成功使用专用终结点测试了函数应用设置。

了解专用 DNS 区域

你已使用专用终结点连接到 Azure 资源。 你正在连接到专用 IP 地址而不是公共终结点。 现有 Azure 服务配置为使用现有 DNS 连接到公共终结点。 必须重写 DNS 配置才能连接到专用终结点。

将为使用专用终结点配置的每个 Azure 资源创建专用 DNS 区域。 将为与专用终结点关联的每个专用 IP 地址创建一个 DNS 记录。

在本教程中创建了以下 DNS 区域:

  • privatelink.file.core.chinacloudapi.cn
  • privatelink.blob.core.chinacloudapi.cn
  • privatelink.servicebus.chinacloudapi.cn
  • privatelink.chinacloudsites.cn

清理资源

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

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

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

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

后续步骤

在本教程中,你创建了高级函数应用、存储帐户和服务总线。 你已经通过私有终结点保护了所有这些资源。

使用以下链接了解有关 Azure Functions 网络选项和专用终结点的更多信息: