为何Terraform的aws_cognito_user_pool每次plan均显示原地更新?
解决Terraform中AWS Cognito用户池无变更却持续提示原地更新的问题
问题现象
每次执行terraform plan时,aws_cognito_user_pool资源总会被标记为需要原地更新,具体变更内容如下:
# aws_cognito_user_pool.user_pool will be updated in-place ~ resource "aws_cognito_user_pool" "user_pool" { id = "us-east-1_xxxyyy" name = "my-user-pool" tags = { "Name" = "my-user-pool" } # (10 unchanged attributes hidden) ~ password_policy { - temporary_password_validity_days = 7 -> null # (5 unchanged attributes hidden) } # (4 unchanged blocks hidden) }
实际并未对该资源做任何修改。
原因分析
这不是Bug,是Terraform AWS Provider与AWS Cognito API的交互特性导致的:
- AWS Cognito用户池的
temporary_password_validity_days参数有默认值7,即便你没在Terraform配置里定义它,AWS API返回资源状态时也会带上这个默认值。 - 但Terraform的本地状态里没有记录这个参数,所以每次执行
plan时,会判定需要把该参数从API返回的7改为配置中未定义的null,从而产生无意义的变更提示。
解决方法
- 在
aws_cognito_user_pool资源的password_policy块中,显式添加temporary_password_validity_days = 7(或你需要的有效值,范围为1-365),让Terraform配置与AWS返回的默认值对齐:
resource "aws_cognito_user_pool" "user_pool" { # 其他已有配置... password_policy { # 其他已有配置... temporary_password_validity_days = 7 } }
- 执行一次
terraform apply,之后再运行terraform plan就不会再出现该无意义的变更提示了。
内容的提问来源于stack exchange,提问作者Drew B
相关产品推荐
相关产品推荐

