Terraform导入AWS RDS实例时重置凭证的原因及解决方法咨询
我们有一批AWS上的现有资源希望纳入Terraform管理,其中包含一个RDS数据库。为此编写了如下配置:
resource "aws_db_instance" "db" { engine = "postgres" username = var.rds_username password = var.rds_password # other stuff... } variable "rds_username" { type = string default = "master_username" } variable "rds_password" { type = string default = "master_password" sensitive = true }
注意配置中使用的是该RDS实例已有的主凭证。随后执行导入命令:
terraform import aws_db_instance.db db-identifier
多次执行terraform plan并调整配置,直到其显示无变更需要执行。
但执行terraform apply后,RDS实例的主凭证被重置,导致原本使用该凭证的其他服务无法连接数据库。
请问该现象原因是什么?Terraform是否后台加密了密码?为何原有凭证失效?有无不重置凭证导入RDS的方法?
1. 现象原因
Terraform的aws_db_instance资源无法直接验证配置中的明文密码与AWS端存储的加密后密码是否一致——因为AWS不会返回RDS实例的明文主密码。导入资源后,Terraform无法获取现有密码的真实值,会将配置中的密码标记为"待设置"状态。即使你填的是原有密码,执行terraform apply时,Terraform依然会触发AWS的密码重置操作。
2. Terraform是否后台加密了密码?
Terraform本身不会后台加密密码,但会遵循AWS API的规则:传递密码到AWS时,AWS会自动加密存储该密码。另外,标记为sensitive = true的变量值会在Terraform的日志、输出中被隐藏,这只是敏感信息的展示控制,并非加密存储(如需加密存储,需配合Terraform状态加密功能)。
3. 原有凭证失效的原因
执行terraform apply时,Terraform触发了RDS实例的主密码重置流程,AWS会生成新的有效密码(哪怕你配置的是旧密码,AWS也无法验证其正确性,只能执行重置),因此原有凭证直接失效。
4. 不重置凭证导入RDS的方法
有两种可靠方案可以避免导入后重置密码:
- 方案一:移除配置中的
password字段
导入完成后,删除aws_db_instance资源里的password = var.rds_password行,再执行terraform plan确认无变更。此后Terraform不会管理RDS的主密码,自然不会触发重置操作。后续需要修改密码时,再重新添加该字段并指定新密码即可。 - 方案二:使用
ignore_changes生命周期参数
在aws_db_instance资源中添加生命周期配置,让Terraform忽略password字段的差异:
这样Terraform会跳过密码字段的校验与更新,不会触发重置。之后需要修改密码时,临时移除resource "aws_db_instance" "db" { engine = "postgres" username = var.rds_username password = var.rds_password # other stuff... lifecycle { ignore_changes = [password] } }ignore_changes配置,修改完成后再恢复即可。
内容的提问来源于stack exchange,提问作者yuvi

