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
相关产品推荐
相关产品推荐

