Terraform部署AWS Cognito User Pool二次无变更apply报schema修改错误
Terraform二次部署Cognito User Pool报错解决方案
错误根因
你遇到的cannot modify or remove schema items报错由以下两个原因共同导致:
- 配置中声明的
name、family_name、phone_number都属于AWS Cognito默认预置的标准用户属性,无需在schema块中显式定义 - 3.x版本的hashicorp/aws provider存在逻辑缺陷,会将显式声明的标准属性识别为待新增的自定义属性,首次部署创建成功后,二次执行
terraform apply时会触发无意义的修改逻辑,而Cognito原生不允许修改或删除已存在的schema属性,因此触发报错
可行解决方案
方案1:移除标准属性的schema声明(推荐)
直接删除配置中三个对应标准属性的schema块即可,标准属性默认自带,无需额外配置。修改后的资源配置参考如下:
resource "aws_cognito_user_pool" "pool" { name = "my-user-pool" mfa_configuration = "OFF" username_attributes = ["email"] password_policy { minimum_length = 8 } account_recovery_setting { recovery_mechanism { name = "verified_email" priority = 1 } } auto_verified_attributes = [ "email" ] user_pool_add_ons { advanced_security_mode = "OFF" } }
修改完成后先执行terraform plan确认没有待执行的Cognito schema更新操作,再执行terragrunt apply-all即可正常通过。
方案2:升级AWS Provider版本
如果团队规范要求全量显式声明所有属性,可以将aws provider的版本升级到4.0及以上,该版本已经修复了标准schema的识别缺陷,不会将显式声明的标准属性识别为自定义属性触发修改逻辑。
方案3:添加忽略变更规则(适用于生产环境不可修改配置/重建用户池的场景)
如果当前用户池已经上线投入使用,既不能重建也不能修改现有配置,可以在aws_cognito_user_pool资源中添加lifecycle规则忽略schema变更:
resource "aws_cognito_user_pool" "pool" { // 原有配置保持不变 lifecycle { ignore_changes = [schema] } }
添加后Terraform会跳过schema字段的变更对比,不会触发修改逻辑,即可避免报错。
内容的提问来源于stack exchange,提问作者Olivier Castro-Perrier
相关产品推荐
相关产品推荐

