教程:使用 Azure 虚拟网络 NAT 网关控制 Azure Functions 出站 IP

虚拟网络地址转换 (NAT) 简化了虚拟网络仅限出站的 Internet 连接。 在子网中配置后,所有出站连接将使用指定的静态公共 IP 地址。 NAT 对于需要使用第三方服务(使用 IP 地址允许列表作为安全措施)的应用非常有用。 要了解详细信息,请参阅什么是 Azure NAT 网关?

本教程介绍如何使用 NAT 网关从 HTTP 触发的函数路由出站流量。 此函数可让你检查其自身的出站 IP 地址。 在本教程中,你将:

  • 创建虚拟网络
  • 创建高级计划函数应用
  • 创建公共 IP 地址
  • 创建 NAT 网关
  • 配置函数应用以通过 NAT 网关路由出站流量

拓扑

下图显示了你创建的解决方案的体系结构:

UI for NAT gateway integration

高级计划中运行的函数与 Azure 应用服务中的 Web 应用具有相同的承载功能,其中包括 VNet 集成功能。 若要了解有关 VNet 集成的详细信息(包括故障排除和高级配置),请参阅将应用与 Azure 虚拟网络集成

先决条件

若要学习本教程,必须了解 IP 寻址和子网划分。 可以从这篇介绍了寻址和子网划分基础知识的文章入手。 网上还有其他许多相关文章和视频。

如果没有 Azure 订阅,可在开始前创建一个试用帐户

如果已完成将 Functions 与 Azure 虚拟网络集成教程,可以跳至创建 HTTP 触发器函数

创建虚拟网络

  1. 在 Azure 门户菜单中,选择“创建资源”。 在 Azure 市场中,选择“网络”>“虚拟网络” 。

  2. 在“创建虚拟网络”中,按照下表中显示的说明输入或选择设置:

    设置
    订阅 选择订阅。
    资源组 选择“新建”,输入 myResourceGroup,然后选择“确定”。
    名称 输入 myResourceGroup-vnet
    位置 选择“中国北部 2”。
  3. 选择“下一步: IP 地址”,输入 10.10.0.0/16 作为“IPv4 地址空间”。

  4. 选择“添加子网”,输入 Tutorial-Net 作为“子网名称”,输入 10.10.1.0/24 作为“子网地址范围” 。

    IP Addresses tab for creating a vnet

  5. 选择“添加”,然后选择“查看 + 创建”。 将其余的设置保留默认值,然后选择“创建”。

  6. 在“创建虚拟网络”中,选择“创建”。

接下来,在高级计划中创建一个函数应用。 此计划提供无服务器规模,同时支持虚拟网络集成。

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

本教程介绍如何在高级计划中创建函数应用。 使用专用(应用服务)计划时也可以使用相同的功能。

注意

为在本教程中获得最佳体验,请选择“.NET”作为运行时堆栈,选择“Windows”作为操作系统。 此外,应在虚拟网络所在的同一区域中创建函数应用。

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

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

  3. 在“基本信息”页面上,按照下列所述使用函数应用设置:

    设置 建议值 描述
    订阅 你的订阅 要在其下创建此新函数应用的订阅。
    资源组 myResourceGroup 要在其中创建 Function App 的新资源组的名称。
    函数应用名称 全局唯一名称 用于标识新 Function App 的名称。 有效字符为 a-z(不区分大小写)、0-9-
    发布 代码 用于发布代码文件或 Docker 容器的选项。
    运行时堆栈 首选语言 选择支持你喜欢的函数编程语言的运行时。 Python 开发当前不支持门户内编辑。
    区域 首选区域 选择离你近或离函数访问的其他服务近的区域
  4. 在完成时选择“下一步:托管”。 在“托管”页面上,输入以下设置:

    设置 建议值 说明
    存储帐户 全局唯一名称 创建函数应用使用的存储帐户。 存储帐户名称必须为 3 到 24 个字符,并且只能包含数字和小写字母。 也可使用现有帐户,但该帐户必须符合存储帐户要求
    操作系统 首选操作系统 系统会根据你的运行时堆栈选择为你预先选择一个操作系统,但你可以根据需要更改该设置。 Python 仅在 Linux 上受支持。 仅在 Windows 上支持门户内编辑。
    计划 Premium 定义如何将资源分配给 Function App 的托管计划。 选择“高级”。 默认创建一个新的应用服务计划。 默认的“SKU 和大小”为 EP1,其中 EP 表示“弹性高级”(elastic premium) 。 要了解详细信息,请参阅高级 SKU 的列表
    在高级计划上运行 JavaScript 函数时,应选择 vCPU 数更少的实例。 有关详细信息,请参阅选择单核心高级计划
  5. 在完成时选择“下一步:监视”。 在“监视”页面上,输入以下设置:

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

  7. 在“查看 + 创建”页上查看设置,然后选择“创建”来预配并部署函数应用 。

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

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

    Deployment notification

将函数应用连接到虚拟网络

现在可以将函数应用连接到虚拟网络。

  1. 在函数应用中,选择左侧菜单中的“网络”,然后在“VNet 集成”下选择“单击此处进行配置” 。

    Choose networking in the function app

  2. 在“VNET 集成”页上,选择“添加 VNet” 。

  3. 在“网络功能状态”中,使用插图下面的表格中的设置:

    Define the function app virtual network

    设置 建议值 说明
    虚拟网络 MyResourceGroup-vnet 此虚拟网络就是你先前创建的网络。
    子网 创建新子网 在虚拟网络中创建一个子网供函数应用使用。 必须将 VNet 集成配置为使用空子网。
    子网名称 Function-Net 新子网的名称。
    虚拟网络地址块 10.10.0.0/16 只应定义一个地址块。
    子网地址块 10.10.2.0/24 子网大小限制高级计划函数应用可以横向扩展到的实例总数。 此示例使用具有 254 个可用主机地址的 /24 子网。 此子网进行了超量预配,但易于计算。
  4. 选择“确定”以添加子网。 关闭“VNet 集成”和“网络功能状态”页,返回到函数应用页 。

函数应用现在可以访问虚拟网络。 启用连接后,vnetrouteallenabled 站点设置设定为 1。 必须将此站点设置或旧版 WEBSITE_VNET_ROUTE_ALL 应用程序设置设定为 1

接下来,将 HTTP 触发的函数添加到函数应用中。

创建 HTTP 触发器函数

  1. 从“Functions”窗口的左侧菜单中选择“Functions”,然后从顶部菜单中选择“添加”

  2. 在“新建函数”窗口中,选择“Http 触发器”并接受新函数的默认名称,或输入新名称 。

  3. 在“代码 + 测试”中,将模板生成的 C# 脚本 (.csx) 代码替换为以下代码:

    #r "Newtonsoft.Json"
    
    using System.Net;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Newtonsoft.Json;
    
    public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
    
        var client = new HttpClient();
        var response = await client.GetAsync(@"https://ifconfig.me");
        var responseMessage = await response.Content.ReadAsStringAsync();
    
        return new OkObjectResult(responseMessage);
    }
    

    此代码将调用一个外部网站,该网站返回调用方的 IP 地址,在本例中为此函数。 此方法可让你轻松确定函数应用使用的出站 IP 地址。

现已准备好运行函数并检查当前的出站 IP。

验证当前出站 IP

现在可以运行该函数。 但首先请在门户中查看函数应用正在使用哪些出站 IP。

  1. 在函数应用中,选择“属性”并查看“出站 IP 地址”字段 。

    View function app outbound IP addresses

  2. 现在,返回到你的 HTTP 触发器函数,选择“代码 + 测试”,然后选择“测试/运行” 。

    Test function

  3. 选择“运行”以执行该函数,然后切换到“输出” 。

    Test function output

  4. 验证 HTTP 响应正文中的 IP 地址是否为先前查看的出站 IP 地址中的值之一。

现在,可以创建一个公共 IP,并使用 NAT 网关来修改此出站 IP 地址。

创建公共 IP

  1. 在你的资源组中选择“添加”,在 Azure 市场中搜索“公共 IP 地址”,然后选择“创建” 。 使用插图下面的表格中的设置:

    Create Public IP Address

    设置 建议的值
    IP 版本 IPv4
    SKU Standard
    区域
    名称 出站 IP
    订阅 确保已显示你的订阅
    资源组 myResourceGroup(或分配给你的资源组的名称)
    位置 中国北部 2(或已分配给其他资源的位置)
    可用性区域 无区域
  2. 选择“创建”以提交部署。

  3. 部署完成后,导航到新建的“公共 IP 地址”资源,并查看“概述”中的 IP 地址。

    View Public IP Address

创建 NAT 网关

现在,让我们创建 NAT 网关。 开始学习前面的虚拟网络教程时,Function-Net 是该教程中建议的子网名称,MyResourceGroup-vnet 是该教程中建议的虚拟网络名称。

  1. 在你的资源组中选择“添加”,在 Azure 市场中搜索“NAT 网关”,然后选择“创建” 。 使用插图下面的表格中的设置来填充“基本信息”选项卡:

    Create NAT gateway

    设置 建议的值
    订阅 订阅
    资源组 myResourceGroup(或分配给你的资源组的名称)
    NAT 网关名称 myNatGateway
    区域 中国北部 2(或已分配给其他资源的位置)
    可用性区域
  2. 选择“下一步: 出站 IP”。 在“公共 IP 地址”字段中,选择前面创建的公共 IP 地址。 将“公共 IP 前缀”保持未选中状态。

  3. 选择“下一步: 子网”。 在“虚拟网络”字段中选择“myResourceGroup-vnet”资源,并选择“Function-Net”子网。

    Select subnet

  4. 依次选择“查看 + 创建”和“创建”来提交部署 。

部署完成后,NAT 网关便可以将流量从你的函数应用子网路由到 Internet。

验证新的出站 IP

重复上述步骤再次运行该函数。 现在,在函数输出中应会看到你在 NAT 中配置的出站 IP 地址。

清理资源

你已创建了完成本教程所需的资源。 你需要为这些资源付费,具体取决于你的帐户状态服务定价。 为了避免产生额外的成本,请在不再需要这些资源时将其删除。

  1. 在 Azure 门户中转到“资源组”页。

    若要从函数应用页转到该页,请选择“概览”选项卡,然后选择“资源组”下的链接。

    Screenshot that shows select the resource group to delete from the function app page.

    若要从仪表板转到该页,请选择“资源组”,然后选择用于本文的资源组。

  2. 在“资源组”页中查看所包括的资源的列表,然后验证这些资源是否是要删除的。

  3. 选择“删除资源组”,然后按说明操作。

    删除操作可能需要几分钟。 完成后会显示一个通知,持续数秒。 也可以选择页面顶部的钟形图标来查看通知。

后续步骤