在启用访问限制的情况下从同一区域的管道代理访问 azure 存储帐户

Access azure storage account from pipeline agent in same region with access restrictions enabled

我们正在为我们的云服务使用 Azure 存储帐户。此存储帐户是虚拟网络的一部分,因此对存储帐户的访问仅限于 selected networks 并添加了 vnet。这在我们的服务中非常有效。

当我们尝试在 Azure 管道中将数据复制到此存储帐户时出现问题。在管道内,我们临时向存储帐户添加防火墙规则,以允许从管道代理的 Ip 地址到存储帐户的流量。然后我们复制数据(通过 azcopy),最后删除防火墙规则。这适用于私人代理。但是,我们还使用托管在 azure 中的 private 代理。问题是,如果代理在 azure 中运行,与存储帐户的连接使用 private azure ip 地址,并且防火墙规则不起作用。这在 this doc:

中指定

Services deployed in the same region as the storage account use private Azure IP addresses for communication. Thus, you cannot restrict access to specific Azure services based on their public outbound IP address range.

有什么方法可以强制外部路由吗?在我看来,使用当前配置,我们无法从 azure 中连接到存储帐户,但我们能够从 azure 之外的私人代理(或任何其他 pc)连接。

我已经尝试使用存储帐户 firewalls and virtual networks 部分中的 routing preference 设置,并使用 -internetrouting 端点,但这没有任何效果差异。

根据 here,您需要允许访问与您所在地区匹配的整个 Azure 数据中心。所以我在想一些自动化的东西来查询 API,检索 IP 范围并使用它。

解决方案是使用专用端点。我正在处理同样的问题,经过大量研究后,我发现私有端点将有助于在您的代理所在的远程 vnet 和您的存储所在的 vnet 之间通过内部 IP 进行访问。我已经对此进行了测试并在下面提供了详细信息。

测试后我发现它的工作方式是在存储 vnet 中创建私有 DNS 并设置 vnet DNS link 允许代理所在的远程 vnet 中的 VM 解析存储帐户连接到私有 IP 而不是 public IP。此外,在远程 vnet 中创建了一个 NIC,它提供了到存储私有 IP 的路由。

因此 NIC 与为私有 IP 连接提供路由的代理位于同一个 vnet 中,并且存在 DNS link 以将存储解析为私有 IP,这一切都正常工作。代理将依赖私有 DNS 而不是 public DNS 来解析存储主机名,因此代理将通过私有 IP 与 Azure 正确通信。

编辑:我设置了一个专用端点并确认它按预期工作。使用 terraform 这样做有一些注意事项,我在相关的 azurerm 提供商 GitHub 问题中概述了这些:

https://github.com/hashicorp/terraform-provider-azurerm/issues/2977#issuecomment-1011183736