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

本教程介绍如何使用专用终结点将 Azure Functions 连接到 Azure 虚拟网络中的资源。 使用通过 Azure 门户锁定在虚拟网络后面的新存储帐户创建新的函数应用。 虚拟网络使用服务总线队列触发器。

在本教程中,你将:

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

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

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

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

  2. 在“新建”页面,选择“计算”“函数应用”。

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

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

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

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

    注意

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

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

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

    提示

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

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

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

    设置 建议值 说明
    启用 VNet 集成 这会在创建时将函数应用与 VNet 集成,并通过 VNet 定向所有出站流量。
    出站子网 新建 这会为函数应用的 VNet 集成创建一个新子网。 函数应用只能通过空子网集成 VNet。 提供子网名称。 可以将子网地址块保留为默认值。 如果希望对其进行配置,请在此处详细了解如何调整子网大小。 选择“确定”。 将会显示用于创建存储专用终结点的选项。 要在虚拟网络中使用函数应用,需要将其加入子网。

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

    设置 建议值 说明
    添加存储专用终结点 启用此选项后,门户中会显示在创建时使用 VNet 集成配置应用程序的功能。
    专用终结点名称 myInboundPrivateEndpointName 用于标识存储帐户专用终结点的名称。
    专用终结点子网 新建 这会在存储帐户上为入站专用终结点创建一个新子网。 可将多个专用终结点添加到单个子网。 提供子网名称。 可以将子网地址块保留为默认值。 如果希望对其进行配置,请在此处详细了解如何调整子网大小。 选择“确定”。
    DNS Azure 专用 DNS 区域 此值指示专用终结点会使用的 DNS 服务器。 在大多数情况下,如果在 Azure 中工作,则 Azure 专用 DNS 区域是应使用的 DNS 区域,因为对自定义 DNS 区域使用手动将会增加复杂性。
  6. 在完成时选择“下一步:监视”。 在“监视”页上,输入以下设置。

    设置 建议值 说明
    Application Insights 默认 在最近的受支持的区域中,创建一个具有相同应用名称的 Application Insights 资源。 如果需要更改新资源名称或将数据存储在 Azure 地理位置的其他位置,请展开此设置。
  7. 选择“查看 + 创建”,以便查看应用配置选择。

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

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

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

恭喜! 你已成功创建高级函数应用。

注意

一些部署可能偶尔无法在存储帐户中创建专用终结点,并显示错误“StorageAccountOperationInProgress”。 即使成功创建函数应用本身,也会发生此失败。 在遇到此类错误时,请删除函数应用并重试操作。 可以改为在存储帐户上手动创建专用终结点。

创建服务总线

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

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

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

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

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

锁定服务总线

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

  1. 在新的服务总线中,在左侧菜单中选择“网络”。

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

    Screenshot of how to go to private endpoints for the Service Bus.

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

    设置 建议值 描述
    订阅 订阅 要在其中创建资源的订阅。
    资源组 myResourceGroup 用函数应用创建的资源组。
    名称 sb-endpoint 服务总线的专用终结点名称。
    区域 myFunctionRegion 创建存储帐户的区域。
  4. 在“资源”选项卡上,使用下表中显示的专用终结点设置。

    设置 建议值 描述
    订阅 订阅 要在其下创建资源的订阅。
    资源类型 Microsoft.ServiceBus/namespaces 服务总线的资源类型。
    资源 myServiceBus 在本教程前面创建的服务总线。
    目标子资源 命名空间 用于服务总线中命名空间的专用终结点。
  5. 在“虚拟网络”选项卡上为“子网”设置选择“默认”。

  6. 选择“查看 + 创建”。 通过验证后,选择“创建”。

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

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

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

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

    设置 建议值 描述
    订阅 订阅 要在其下创建资源的订阅。
    虚拟网络 myVirtualNet 函数应用将连接到的虚拟网络的名称。
    子网 functions 函数应用将连接到的子网的名称。
  11. 选择“添加客户端 IP 地址”,为当前客户端 IP 授予对命名空间的访问权限。

    注意

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

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

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

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

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

创建队列

创建 Azure Functions 服务总线触发器将在其中获取事件的队列:

  1. 在服务总线中,在左侧菜单中选择“队列”。

  2. 选择“队列”。 对于本教程,请将新队列命名为“队列”。

    Screenshot of how to create a Service Bus queue.

  3. 选择创建

获取服务总线连接字符串

  1. 在服务总线中,在左侧菜单中选择“共享访问策略”。

  2. 选择“RootManageSharedAccessKey”。 复制并保存“主连接字符串”。 在配置应用设置时,需要使用此连接字符串。

    Screenshot of how to get a Service Bus connection string.

配置函数应用设置

  1. 在函数应用中,在左侧菜单中选择“配置”。

  2. 要将函数应用与虚拟网络和服务总线一起使用,请更新下表中显示的应用设置。 若要添加或编辑设置,请选择“+ 新增应用程序设置”或应用设置表最右侧列中的“编辑”图标。 完成后,选择“保存”。

    设置 建议值 说明
    SERVICEBUS_CONNECTION myServiceBusConnectionString 为服务总线的连接字符串创建此应用设置。 此存储连接字符串来自获取服务总线连接字符串部分。
    WEBSITE_CONTENTOVERVNET 1 创建此应用设置。 将存储帐户限制在虚拟网络中时,值 1 允许函数应用进行缩放。
  3. 由于使用的是弹性高级托管计划,因此请在“配置”视图中,选择“函数运行时设置”选项卡。将“运行时规模监视”设置为“”。 再选择“保存”。 运行时驱动的缩放使你能够将非 HTTP 触发器函数连接到在虚拟网络中运行的各项服务。

    Screenshot of how to enable runtime-driven scaling for Azure Functions.

注意

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

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

注意

启用函数应用上的专用终结点还会导致无法公开访问源代码管理器 (SCM) 站点。 以下说明给出了使用函数应用中的部署中心进行部署的指导。 或者,使用部署到虚拟网络上的子网中的 zip 部署或自托管代理。

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

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

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

  3. 在函数应用中,在左侧菜单中选择“部署中心”。 然后选择“设置”。

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

    设置 建议值 说明
    Source GitHub 应该已为步骤 2 中的示例代码创建了 GitHub 存储库。
    组织 myOrganization 要签入存储库的组织。 它通常是你的帐户。
    存储库 functions-vnet-tutorial https://github.com/Azure-Samples/functions-vnet-tutorial 分支的存储库。
    分支 主要 创建的存储库的主分支。
    运行时堆栈 .NET 示例代码是用 C# 编写的。
    版本 .NET Core 3.1 运行时版本。
  5. 选择“保存”。

    Screenshot of how to deploy Azure Functions code through the portal.

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

恭喜! 你已成功部署了示例函数应用。

测试锁定的函数应用

  1. 在函数应用中,在左侧菜单中选择“函数”。

  2. 选择“ServiceBusQueueTrigger”。

  3. 在左侧菜单中选择“监视”

你会发现你无法监视应用。 你的浏览器无法访问虚拟网络,因此无法直接访问虚拟网络中的资源。

下面是使用 Application Insights 监视函数的另一种方法:

  1. 在函数应用中,在左侧菜单中选择“Application Insights”。 然后选择“查看 Application Insights 数据”。

    Screenshot of how to view application insights for a function app.

  2. 在左侧菜单中选择“实时指标”。

  3. 打开新选项卡,在服务总线中的左侧菜单中选择“队列”。

  4. 选择队列。

  5. 在左侧菜单中,选择“Service Bus Explorer”。 在“发送”下,为“内容类型”选择“文本/无格式”。 然后输入一条消息。

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

    Screenshot of how to send Service Bus messages by using the portal.

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

    Screenshot of how to view messages by using live metrics for function apps.

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

了解专用 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 网络选项和专用终结点: