You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中获取azurerm_storage_account的endpoint_resource_id

问题描述

在配置Azure存储账户的private_link_access规则时,当前代码硬编码了endpoint_resource_id为"/subscriptions/00000-00000-00000-00000/providers/Microsoft.Security/datascanners/storageDataScanner",希望通过Terraform数据源或其他动态方式获取该ID,避免硬编码的维护风险。

用户提供的配置代码如下:

main.tf

resource "azurerm_storage_account" "storageaccount" {
  name                              = var.azstorageaccount_name
  resource_group_name               = data.azurerm_resource_group.system_rg_name.name
  location                          = var.location
  account_tier                      = var.account_tier             # Premium, Standard
  account_replication_type          = var.account_replication_type # GRS
  account_kind                      = var.account_kind             # FileStorage
  access_tier                       = var.access_tier              # Hot, Cool
  large_file_share_enabled          = var.large_file_share_enabled
  is_hns_enabled                    = var.is_hns_enabled
  sftp_enabled                      = var.is_sftp_enabled
  public_network_access_enabled     = var.public_network_access_enabled

  blob_properties  {
    container_delete_retention_policy {
      days = var.container_delete_retention_policy
    }
    delete_retention_policy {
      days = var.delete_retention_policy
    }
  }
  
  network_rules {
    default_action             = var.network_rules_default_action
    ip_rules                   = toset("${var.network_rules_ip_rules}")
    private_link_access {
      endpoint_resource_id = "/subscriptions/00000-00000-00000-00000/providers/Microsoft.Security/datascanners/storageDataScanner"
    }
    # virtual_network_subnet_ids = [data.azurerm_subnet.network_subnet.id]
  }

  tags = {
    Environment = "${var.tag}"
  }
}

var.tf

variable "azstorageaccount_name" {
  type    = string
  default = "teststroage001"
}

variable "large_file_share_enabled" {
  type    = string
  default = "false"
}

variable "account_tier" {
  type    = string
  default = "Standard"
}

variable "account_replication_type" {
  type    = string
  default = "LRS"
}

variable "account_kind" {
  type    = string
  default = "BlobStorage"
}

variable "access_tier" {
  type    = string
  default = "Cool"
}

variable "is_hns_enabled" {
  type    = string
  default = "false"
}

variable "is_sftp_enabled" {
  type    = string
  default = "false"
}

variable "public_network_access_enabled" {
  type    = string
  default = "true"
}

variable "container_delete_retention_policy" {
  type    = string
  default = "7"
}

variable "delete_retention_policy" {
  type    = string
  default = "7"
}

variable "network_rules_default_action" {
  type = string
  default = "Deny" # Allow
}

variable "network_rules_ip_rules" {
  type = list(string)
  default = [ " ]
}

variable "endpoint_resource_id" {
  type    = string
  default = ""
}
解决方案

1. 使用通用资源数据源azurerm_resource动态查询

由于Azure Security的storageDataScanner没有专门的Terraform数据源,可以通过通用的azurerm_resource资源查询来获取其ID,避免硬编码。

添加以下数据源配置:

data "azurerm_resource" "security_datascanner" {
  name                = "storageDataScanner"
  resource_type       = "Microsoft.Security/datascanners"
  subscription_id     = "00000-00000-00000-00000" # 若资源在当前订阅下,可省略该字段
}

然后修改存储账户的private_link_access配置,引用数据源的ID:

private_link_access {
  endpoint_resource_id = data.azurerm_resource.security_datascanner.id
}

2. 若资源为当前配置内创建(非Azure内置)

如果这个storageDataScanner是你通过Terraform自行创建的资源,直接引用该资源实例的id字段即可,示例:

private_link_access {
  endpoint_resource_id = azurerm_security_datascanner.your_scanner.id
}

(注:需根据实际使用的资源类型调整资源名称)

3. 修正变量配置的语法错误

你的var.tf中network_rules_ip_rules的默认值存在语法错误,需修正为:

variable "network_rules_ip_rules" {
  type    = list(string)
  default = []
}

内容的提问来源于stack exchange,提问作者gotothesky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:54:52