如何避免Terraform因移除自定义属性销毁AWS Cognito用户池?
解决Terraform触发AWS Cognito用户池销毁的问题
我之前也踩过这个坑,核心原因其实是AWS Cognito用户池的自定义属性一旦创建就无法删除,而Terraform发现你配置里移除了这个属性后,默认会尝试销毁整个用户池来重建(因为它没法原地删除这个属性)。下面给你两个可行的解决办法:
方法一:保留已废弃的属性配置(最简单)
直接在你的Terraform配置里保留那个不再使用的schema块,但加上注释标记它已废弃,不要直接删除。这样Terraform会认为配置和状态一致,就不会触发销毁操作了:
resource "aws_cognito_user_pool" "my_pool" { name = "${var.la} Pool" alias_attributes = [ "email" ] /* Auto-verify these fields */ auto_verified_attributes = [ "email" ] ... # Deprecated: 该属性已不再使用,保留是为了避免用户池被销毁 schema { attribute_data_type = "String" name = "my_custom_attribute1" required = "false" mutable = "true" } }
方法二:手动修改Terraform状态(彻底移除配置中的属性)
如果你确实想把这个属性从配置文件里删掉,那需要手动让Terraform停止跟踪这个schema属性,步骤如下:
- 先从你的配置文件中移除那个
schema块 - 备份当前的Terraform状态(非常重要,防止操作失误):
terraform state pull > state-backup.tfstate - 运行命令移除状态中对应的schema属性(注意索引要和你实际的属性位置对应,比如第一个schema就是
[0]):terraform state rm 'aws_cognito_user_pool.my_pool.schema[0]' - 现在再运行
terraform plan,应该就不会再出现销毁用户池的提示了
注意事项
- AWS Cognito的自定义属性创建后就无法在AWS控制台或API中删除,所以即使你让Terraform不再管理它,这个属性依然会存在于用户池中,只是不会影响你的后续操作
- 修改Terraform状态前一定要备份,避免意外破坏状态文件
内容的提问来源于stack exchange,提问作者cyram
相关产品推荐
相关产品推荐

