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

Terraform执行apply后运行plan持续检测到配置漂移求解决建议

Terraform Azure存储账户配置漂移解决建议

问题说明

执行terraform apply后,每次运行terraform plan都会检测到Azure存储账户的配置漂移,具体变更如下:

Terraform检测到自上次"terraform apply"以来,有以下外部修改可能影响本次计划

注意:对象已在Terraform外部发生变更

Terraform检测到自上次"terraform apply"以来,有以下外部修改可能影响本次计划:

  # module.this.azurerm_storage_account.this 已变更
  ~ resource "azurerm_storage_account" "this" {
        id                                = "/subscriptions/d4gbaaf88-4ygX2-4tg3-9611-XXXXXXXXXXXXX/resourceGroups/rg-ifhq/providers/Microsoft.Storage/storageAccounts/stieiq"
        name                              = "stiggiq"
        tags                              = {
            "dept"  = "IT"
            "env"   = "Prod"
            "owner" = "Smith"
        }
        # (39个未变更属性已隐藏)

      ~ network_rules {
          ~ default_action             = "Allow" -> "Deny"
          ~ ip_rules                   = [
              + "125.125.125.1",
            ]
          ~ virtual_network_subnet_ids = [
              + "/subscriptions/d4gbaaf88-4ygX2-4tg3-9611-XXXXXXXXXXXXX/resourceGroups/rg-ifhq/providers/Microsoft.Network/virtualNetworks/vnet-rfeiq/subnets/snet-gerq",
            ]
            # (1个未变更属性已隐藏)
        }

        # (4个未变更块已隐藏)
    }


除非您已对配置做出等效修改,或使用ignore_changes忽略了相关属性,否则本次计划可能包含撤销或响应这些变更的操作。

相关变量配置:

variable "network_rules" {
  type = object({
    bypass                     = optional(set(string), [])
    default_action             = optional(string, "Deny")
    ip_rules                   = optional(set(string), [])
    virtual_network_subnet_ids = optional(set(string), [])
    private_link_access = optional(list(object({
      endpoint_resource_id = string
      endpoint_tenant_id   = optional(string)
    })))
    timeouts = optional(object({
      create = optional(string)
      delete = optional(string)
      read   = optional(string)
      update = optional(string)
    }))
  })
  default = {}
}

标签配置:

tags = {
    env   = "Prod"
    owner = "Smith"
    dept  = "IT"
  }

解决方法

1. 同步外部修改到Terraform配置

如果这些network_rules的变更是合法操作(比如手动调整了存储账户网络规则),需要把实际配置同步到Terraform代码中:

  • 更新network_rules变量的默认值,或者在引用该变量的azurerm_storage_account资源块中传入正确参数:
# 示例:更新network_rules变量的默认值
variable "network_rules" {
  type = object({
    bypass                     = optional(set(string), [])
    default_action             = optional(string, "Deny")
    ip_rules                   = optional(set(string), ["125.125.125.1"])
    virtual_network_subnet_ids = optional(set(string), ["/subscriptions/d4gbaaf88-4ygX2-4tg3-9611-XXXXXXXXXXXXX/resourceGroups/rg-ifhq/providers/Microsoft.Network/virtualNetworks/vnet-rfeiq/subnets/snet-gerq"])
    private_link_access = optional(list(object({
      endpoint_resource_id = string
      endpoint_tenant_id   = optional(string)
    })))
    timeouts = optional(object({
      create = optional(string)
      delete = optional(string)
      read   = optional(string)
      update = optional(string)
    }))
  })
  default = {}
}
  • 执行terraform apply,让Terraform状态与实际资源一致,后续plan将不再检测漂移。

2. 回滚外部修改,保持Terraform配置权威

如果这些变更是意外操作,需要恢复到Terraform配置的状态:

  • 直接执行terraform apply,Terraform会自动将存储账户的network_rules改回配置定义的状态。注意:执行前确认该操作不会影响业务访问。

3. 忽略指定属性的配置漂移

如果允许外部修改network_rules,且不希望Terraform检测这些变更,可以在azurerm_storage_account资源块中添加lifecycle配置:

resource "azurerm_storage_account" "this" {
  # 其他资源配置...
  tags = var.tags

  network_rules = var.network_rules

  lifecycle {
    ignore_changes = [
      network_rules, # 忽略整个network_rules块的变更
      # 也可以单独忽略子属性:network_rules[0].default_action, network_rules[0].ip_rules
    ]
  }
}
  • 添加后,terraform plan将不再检测network_rules的外部变更。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:47:29