通过


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

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

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

在本教程中,你将:

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

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

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

  1. 在Azure门户菜单或 Home 页上,选择创建资源

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

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

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

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

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

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

    注意

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

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

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

    提示

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

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

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

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

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

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

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

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

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

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

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

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

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

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

创建 服务总线

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

  1. 在Azure门户菜单或 Home 页上,选择创建资源

  2. New 页上,搜索 服务总线。 然后选择“创建”

  3. Basics 选项卡上,使用下表配置服务总线设置。 所有其他设置都可以使用默认值。

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

锁定服务总线

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

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

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

    如何进入 服务总线 的专用终结点的截图。

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

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

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

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

  7. 创建专用终结点后,返回到服务总线命名空间的 Networking 部分,并检查Public Access选项卡。

  8. 确保“所选网络”处于选中状态

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

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

    设置 建议的值 说明
    Subscription 订阅 要在其下创建资源的订阅。
    虚拟网络 myVirtualNet 函数应用将连接到的虚拟网络的名称。
    子网 functions 函数应用将连接到的子网的名称。
  11. 选择“添加客户端 IP 地址”,使当前客户端 IP 可以访问命名空间。

    注意

    允许客户端 IP 地址是必要的,以便 Azure 门户能够在本教程后面将消息发布到队列

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

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

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

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

创建队列

为你的 Azure Functions 服务总线触发器创建一个用于接收事件的队列:

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

  2. 选择“队列”。 出于本教程的目的,将新队列命名为“队列”

    服务总线 队列创建截图.

  3. 选择 创建

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

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

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

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

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

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

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

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

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

配置函数应用设置

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

  2. 若要使用托管标识将函数应用连接到服务总线,需要添加服务总线命名空间设置。 选择“+ 添加”以创建名为“SERVICEBUS_CONNECTION__fullyQualifiedNamespace”的新设置,其值为 <SERVICE_BUS_NAMESPACE>.servicebus.windows.net,将 <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. 在页面顶部,选择“Fork”来在自己的GitHub帐户或组织中创建该存储库的分叉。

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

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

    设置 建议的值 说明
    来源 GitHub 应在步骤 2 中为示例代码创建GitHub存储库。
    组织 我的组织 要签入存储库的组织。 它通常是你的帐户。
    Repository 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. Live metrics 选项卡上,您应该会看到 服务总线 队列触发器已被触发。 如果没有,请从 服务总线 Explorer 重新发送消息。

    显示如何使用函数应用的实时指标来查看消息的屏幕截图。

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

了解专用 DNS 区域

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

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

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

  • privatelink.file.core.windows.net
  • privatelink.blob.core.windows.net
  • privatelink.servicebus.windows.net
  • privatelink.azurewebsites.net

清理资源

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

  1. 在Azure门户菜单或主页中,选择Resource groups>myResourceGroup

  2. 请在myResourceGroup窗格中确认,列出的资源是否是您想要删除的。

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

后续步骤

在本教程中,你创建了一个高级函数应用、存储帐户和服务总线。 你保护了专用终结点后面的所有资源。

使用以下链接了解 Azure Functions 的网络选项和专用终结点的详细信息: