azure - 通过 Bicep 部署队列、blob 和 ADLS2 专用端点出错

标签 azure connectivity azure-bicep azure-private-link

我正在尝试在两个存储帐户下部署三个 Azure 存储资源,并且我想要实现三个专用终结点,以仅允许从同一 VNET 中的虚拟机连接到这些资源。需要连接到两个单独存储帐户的资源类型为(每个存储帐户):

storageAccountTemp

  1. Azure Blob 队列
  2. Azure Blob 存储

存储帐户数据湖

  1. ADLS 2 容器(数据湖)

我有以下用于部署永久和临时存储的 Azure Bicep 代码:

param location string
param environmentType string
param storageAccountSku string
param privateEndpointsSubnetId string

var privateEndpointNameTmpstBlob = 'pe-tmpst-blob-${environmentType}-001'
var privateEndpointNameTmpstQueue = 'pe-tmpst-queue-{environmentType}-001'
var privateEndpointNamePst = 'pe-pst-${environmentType}-001'

/// Temp storage ///
resource storageAccountTemp 'Microsoft.Storage/storageAccounts@2021-08-01' = {
  name: 'tmpst${environmentType}'
  location: location
  sku: {
    name: storageAccountSku
  }
  kind: 'StorageV2'
  properties: {
    allowBlobPublicAccess: false
    accessTier: 'Hot'
    minimumTlsVersion: 'TLS1_0'
    publicNetworkAccess: 'Disabled'
  }
}

resource blobContainerForQueue 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-08-01' = {
  name: '${storageAccountTemp.name}/default/claimcheck-storage-${environmentType}'
  properties: {
    publicAccess: 'None'
  }
}

resource storageQueueMain 'Microsoft.Storage/storageAccounts/queueServices/queues@2019-06-01' = {
  name: '${storageAccountTemp.name}/default/queue-main-${environmentType}'
}

/// Persistant storage datalake ///
resource storageAccountDatalake 'Microsoft.Storage/storageAccounts@2021-08-01' = {
  name: 'pstdatalake${environmentType}'
  location: location
  sku: {
    name: storageAccountSku
  }
  kind: 'StorageV2'
  properties: {
    allowBlobPublicAccess: false
    accessTier: 'Hot'
    minimumTlsVersion: 'TLS1_0'
    isHnsEnabled: true
    publicNetworkAccess: 'Disabled'
  }
}

/// Data///
resource ContainerForData 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-08-01' = {
  name: '${storageAccountDatalake.name}/default/data-${environmentType}'
  properties: {
    publicAccess: 'None'
  }
}

/// Private endpoints configuration for tempblob, queue and datalake ///
resource privateEndpointTmpstBlob 'Microsoft.Network/privateEndpoints@2021-05-01' = if (environmentType == 'dev' || environmentType == 'prd') {
  name: privateEndpointNameTmpstBlob
  location: location
  properties: {
    subnet: {
      id: privateEndpointsSubnetId
    }
    privateLinkServiceConnections: [
      {
        name: privateEndpointNameTmpstBlob
        properties: {
          privateLinkServiceId: storageAccountTemp.id
          groupIds: ['blob']
        }
      }
    ]
  }
}

resource privateEndpointTmpstQueue 'Microsoft.Network/privateEndpoints@2021-05-01' = if (environmentType == 'dev' || environmentType == 'prd') {
  name: privateEndpointNameTmpstQueue
  location: location
  properties: {
    subnet: {
      id: privateEndpointsSubnetId
    }
    privateLinkServiceConnections: [
      {
        name: privateEndpointNameTmpstQueue
        properties: {
          privateLinkServiceId: storageAccountTemp.id
          groupIds: ['queue']
        }
      }
    ]
  }
}

resource privateEndpointPst 'Microsoft.Network/privateEndpoints@2021-05-01' = if (environmentType == 'dev' || environmentType == 'prd') {
  name: privateEndpointNamePst
  location: location
  properties: {
    subnet: {
      id: privateEndpointsSubnetId
    }
    privateLinkServiceConnections: [
      {
        name: privateEndpointNamePst
        properties: {
          privateLinkServiceId: storageAccountDatalake.id
          groupIds: ['blob']
        }
      }
    ]
  }
}

如您所见,对于存储帐户,IsHnsEnabled 设置为 true,以启用 HierarchicalNamespace 以及 ADLS2 功能。问题是,如果我在 Bicep 部署中包含 privateEndpointPst 资源部署,然后尝试从与专用终结点位于同一 VNET 中的虚拟机(位于生成 privateEndpointsSubnetId 的子网中)查看门户中的数据湖容器变量),当尝试查看数据湖容器之一中的文件时,我收到以下消息: enter image description here

我相信这不是图中的问题。原因是,当我将所有三个端点部署在一起时,当我部署所有三个端点时,在尝试查看 storageAccountTemp 和 storageAccountDatalake 中的 blob/queue/datalake 时,它​​们都会显示相同的问题。

但是,仅部署 storageAccountTemp 资源的两个端点,而不是 Datalake 的端点,当从 VNET 中的虚拟机运行时,我可以看到门户中的数据,并且从该虚拟机运行的代码也可以到达队列 + blob 。因此,privateEndpointPst 的部署不仅似乎会扰乱数据湖的可访问性,而且如果我完全部署它们,它还会以某种方式对 storageAccountTemp 中的其他队列和 blob 的可访问性造成同样的影响。我很困惑为什么会发生这种情况,以及为什么我似乎无法以正确的方式部署数据湖端点。此外,有时,完全部署端点将使数据湖端点正常工作,并破坏其他两个端点,这更令人难以置信。单击您是否想要进行一些检查来检测常见的连接问题会给我提供以下信息,但这并没有让我更清楚导致问题的原因(因为我很确定这不是防火墙) ;有时可以访问,有时不能访问): enter image description here 有谁知道我的 Bicep 代码用于部署可能导致此问题的端点有什么问题吗?我在这里很茫然。还尝试将 groupIds: ['blob'] 替换为 groupIds: ['dfs'],但这似乎并不能解决我的问题。

最佳答案

我似乎发现了问题。要连接到数据湖资源,需要同时拥有带有 groupIds: ['blob']groupIds: ['dfs] 的私有(private)端点,因为 blob API 是仍然用于获取有关容器的一些元信息(据我所知)。

所以添加:

resource privateEndpointPstDfs 'Microsoft.Network/privateEndpoints@2021-05-01' = if (environmentType == 'dev' || environmentType == 'prd') {
  name: privateEndpointNamePstDfs
  location: location
  properties: {
    subnet: {
      id: privateEndpointsSubnetId
    }
    privateLinkServiceConnections: [
      {
        name: privateEndpointNamePstDfs
        properties: {
          privateLinkServiceId: storageAccountDatalake.id
          groupIds: ['dfs']
        }
      }
    ]
  }
}

使部署成功。

关于azure - 通过 Bicep 部署队列、blob 和 ADLS2 专用端点出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73817871/

相关文章:

javascript - Azure 应用服务 EasyApi - 如何访问表数据(CRUD)

c# - 间歇性 "unable to connect to remote server"错误

java - MySql Java 连接抛出异常。(更新)

mysql - xampp的mysql连接问题

azure - 我可以将 Azure 资源的现有状态与 Azure Bicep 或 Pulumi 文件合并吗?

Azure Bicep - 引用无法在开始时计算的变量

Azure Bicep - 如果使用相同模板进行部署时显示资源更改的命令会怎样

node.js - 从 NodeJS 中的 Azure Function 访问 SQL 数据库

c# - 当使用 WebRole.cs 运行 "OnStart()"中的自定义代码时,推荐的调用 base.OnStart() 的方法是什么?

asp.net - ASP.NET 中的数据访问 : In-memory collection vs database