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

配置对虚拟网络中后端存储的专用网络访问

注意

基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用

本文适用于:✔️ 标准计划 ✔️ 企业计划

本文介绍了如何为虚拟网络中的应用程序配置对后端存储的专用网络访问。

使用虚拟网络注入在 Azure Spring Apps 服务实例中部署应用程序时,服务实例依赖于后端存储来存储相关的资产,包括 JAR 文件和日志。 虽然默认配置通过公共网络将流量路由到此后端存储,但可以启用专用存储访问功能。 借助此功能,可以通过专用网络来传输流量,从而增强安全性,并可能会提高性能。

注意

此功能仅适用于 Azure Spring Apps 虚拟网络注入的服务实例。

在为 Azure Spring Apps 服务实例启用此功能之前,请确保服务运行时子网中至少有两个可用的 IP 地址。

启用或禁用此功能会将 DNS 解析更改为后端存储。 在短时间内,你可能会经历部署无法与后端存储建立连接或无法在更新期间解析其终结点。

启用此功能后,只能以专用方式访问后端存储,因此必须在虚拟网络中部署应用程序。

先决条件

创建新的 Azure Spring Apps 实例时启用专用存储访问

在虚拟网络中创建 Azure Spring Apps 实例时,使用以下命令来传递参数 --enable-private-storage-access true 以启用专用存储访问。 有关详细信息,请参阅在虚拟网络中部署 Azure Spring Apps

az spring create \
    --resource-group "<resource-group>" \
    --name "<Azure-Spring-Apps-instance-name>" \
    --vnet "<virtual-network-name>" \
    --service-runtime-subnet "<service-runtime-subnet>" \
    --app-subnet "<apps-subnet>" \
    --location "<location>" \
    --enable-private-storage-access true

将在你的订阅中创建另外一个资源组来托管 Azure Spring Apps 实例的专用链接资源。 此资源组名为 ap-res_{service instance name}_{service instance region}

此资源组中部署了两套专用链接资源,每套资源都包括以下 Azure 资源:

  • 一个专用终结点,表示后端存储帐户的专用终结点。
  • 一个网络接口 (NIC),它持有服务运行时子网中的一个专用 IP 地址。
  • 一个为虚拟网络部署的专用 DNS 区域,还有一条为此 DNS 区域中的存储帐户创建的 DNS A 记录。

重要

资源组由 Azure Spring Apps 服务完全托管。 请不要手动删除或修改这些资源组内的任何资源。

为现有 Azure Spring Apps 实例启用或禁用专用存储访问

使用以下命令更新现有 Azure Spring Apps 实例以启用或禁用专用存储访问:

az spring update \
    --resource-group "<resource-group>" \
    --name "<Azure-Spring-Apps-instance-name>" \
    --enable-private-storage-access <true-or-false>

使用中央 DNS 解析

集中式 DNS 管理体系结构记录在大规模专用链接和 DNS 集成的中心辐射型网络体系结构中。 在此体系结构中,所有专用 DNS 区域都在与 Azure Spring Apps 服务实例不同的中央虚拟网络中集中部署和管理。 如果使用此体系结构,可以通过适当配置 DNS 设置来启用专用存储访问的中央 DNS 解析。 此设置可确保:

  • 创建专用终结点时,相应的 DNS 记录会自动添加到集中式专用 DNS 区域。
  • DNS 记录根据专用终结点的生命周期进行管理,这意味着在删除专用终结点时会自动删除这些记录。

以下部分介绍如何使用 Azure Policy 为 Azure 存储 Blob 启用中央 DNS 解析,前提是已在中央虚拟网络中设置了专用 DNS 区域 privatelink.blob.core.windows.net。 相同的原则也适用于支持专用链接的 Azure 存储文件和其他 Azure 服务。

策略定义

除了专用 DNS 区域,还需要创建自定义 Azure Policy 定义。 有关详细信息,请参阅教程:创建自定义策略定义。 创建专用终结点时,此定义会自动在中央专用 DNS 区域中创建所需的 DNS 记录。

使用特定于服务的 groupId 创建专用终结点资源时,将触发以下策略。 groupId 是从此专用终结点应连接到的远程资源或服务服务获取的组的 ID。 在此示例中,Azure 存储 Blob 的 groupIdblob。 有关其他 Azure 服务的 groupId 的详细信息,请参阅“子资源”列下 Azure 专用终结点专用 DNS 区域值中的表

然后,该策略会触发专用终结点内的 privateDNSZoneGroup 部署,从而将专用终结点与指定为参数的专用 DNS 区域关联起来。 在以下示例中,专用 DNS 区域资源 ID 为 /subscriptions/<subscription-id>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/privateDnsZones/privatelink.blob.core.windows.net

{
  "mode": "Indexed",
  "policyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "equals": "Microsoft.Network/privateEndpoints"
        },
        {
          "value": "[contains(resourceGroup().name, 'ap-res_')]",
          "equals": "true"
        },
        {
          "count": {
            "field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].groupIds[*]",
            "where": {
              "field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].groupIds[*]",
              "equals": "blob"
            }
          },
          "greaterOrEquals": 1
        }
      ]
    },
    "then": {
      "effect": "deployIfNotExists",
      "details": {
        "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
        "evaluationDelay": "AfterProvisioningSuccess",
        "roleDefinitionIds": [
          "/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
        ],
        "deployment": {
          "properties": {
            "mode": "incremental",
            "template": {
              "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
              "contentVersion": "1.0.0.0",
              "parameters": {
                "privateDnsZoneId": {
                  "type": "string"
                },
                "privateEndpointName": {
                  "type": "string"
                },
                "location": {
                  "type": "string"
                }
              },
              "resources": [
                {
                  "name": "[concat(parameters('privateEndpointName'), '/deployedByPolicy')]",
                  "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
                  "apiVersion": "2020-03-01",
                  "location": "[parameters('location')]",
                  "properties": {
                    "privateDnsZoneConfigs": [
                      {
                        "name": "storageBlob-privateDnsZone",
                        "properties": {
                          "privateDnsZoneId": "[parameters('privateDnsZoneId')]"
                        }
                      }
                    ]
                  }
                }
              ]
            },
            "parameters": {
              "privateDnsZoneId": {
                "value": "[parameters('privateDnsZoneId')]"
              },
              "privateEndpointName": {
                "value": "[field('name')]"
              },
              "location": {
                "value": "[field('location')]"
              }
            }
          }
        }
      }
    }
  },
  "parameters": {
    "privateDnsZoneId": {
      "type": "String",
      "metadata": {
        "displayName": "privateDnsZoneId",
        "description": null,
        "strongType": "Microsoft.Network/privateDnsZones"
      }
    }
  }
}

策略分配

部署策略定义后,在托管 Azure Spring Apps 服务实例的订阅中分配策略,并将中央专用 DNS 区域指定为参数。

中央专用 DNS 区域和 Azure Spring Apps 服务实例可能托管在不同的订阅中。 在这种情况下,请记得在订阅和资源组中分配专用 DNS 区域参与者角色,其中专用 DNS 区域托管到由 DeployIfNotExists 策略分配创建的托管标识,该策略分配将负责在专用 DNS 区域中创建和管理专用终结点 DNS 记录。 有关详细信息,请参阅修正 Azure Policy 中的不符合资源配置托管标识部分。

完成配置后,启用或禁用专用存储访问功能时,专用终结点的 DNS 记录会自动在相应的专用 DNS 区域中注册,并在删除专用终结点后移除。

额外的费用

对于此功能,Azure Spring Apps 实例不会产生费用。 但是,你需要为订阅中托管的支持此功能的专用链接资源付费。 有关详细信息,请参阅 Azure 专用链接定价Azure DNS 定价

使用自定义 DNS 服务器

如果你使用自定义域名系统 (DNS) 服务器,并且未将 Azure DNS IP 168.63.129.16 配置为上游 DNS 服务器,则必须手动绑定资源组 ap-res_{service instance name}_{service instance region} 中显示的专用 DNS 区域的所有 DNS 记录才能解析专用 IP 地址。

后续步骤