执行Terraform State迁移后,SecretsManager版本资源需重建且导入失败求助
Terraform Secrets Manager 资源迁移后需重建的问题排查与解决
问题描述
我执行了这条命令试图迁移状态:
terraform state mv -state-out="path" module.rds.aws_secretsmanager_secret_version.superuser module.rds.aws_secretsmanager_secret_version.superuser
在新配置中执行terraform plan后,返回资源必须重建的结果:
# module.rds.aws_secretsmanager_secret_version.superuser must be replaced -/+ resource "aws_secretsmanager_secret_version" "superuser" { ~ arn = "arn:aws:secretsmanager:eu-west-2:**********:secret:rds-superuser-TJ*******-M****B" -> (known after apply) ~ id = "arn:aws:secretsmanager:eu-west-2:**********:secret:rds-superuser-TJ*******-M****|terraform-202000000000070000001d" -> (known after apply) ~ secret_string = (sensitive value) # forces replacement ~ version_id = "terraform-202400000000001d" -> (known after apply) ~ version_stages = [ - "AWSCURRENT", ] -> (known after apply) # (1 unchanged attribute hidden) }
我尝试用terraform import命令:
terraform import aws_secretsmanager_secret_version.superuser 'arn:aws:secretsmanager:eu-west-2:::::::secret:rds-superuser-T:::::::::B|terraform-202400000000001d'
但terraform plan结果还是显示需要重建。
换成这条导入命令时直接失败:
terraform import aws_secretsmanager_secret_version.superuser 'arn:aws:secretsmanager:eu-west-2:::::::secret:rds-superuser-T:::::::::B|"AWSCURRENT"'
报错信息:
Error: reading Secrets Manager Secret Version (arn:aws:secretsmanager:eu-west-2::::::secret:rds-superuser-T::::B|AWSCURRENT): operation error Secrets Manager: GetSecretValue, https response error StatusCode: 400, RequestID: 13cf60fc-482a-438a-a22c-4265c56b07cd, api error ValidationException: 1 validation error detected: Value 'AWSCURRENT' at 'versionId' failed to satisfy constraint: Member must have length greater than or equal to 32
问题根源
- 无效的状态迁移命令:你执行的
state mv命令是将资源从自身移动到自身,没有实际将状态写入到指定的-state-out路径,新配置的状态文件中缺少该资源的记录,导致Terraform判定需要重建资源。 - 导入格式错误:
aws_secretsmanager_secret_version的导入ID必须是SecretARN|VersionID格式,AWSCURRENT是版本阶段标记而非VersionID,而VersionID要求长度至少32位,因此用AWSCURRENT会触发验证错误。 - 配置与实际资源不匹配:新配置中的
secret_string或version_stages属性与AWS上已存在的Secret版本不一致,这会触发Terraform的强制替换逻辑。
解决步骤
1. 修正状态迁移命令
确保状态被正确写入到目标路径:
terraform state mv -state-out="path/to/new/state.tfstate" module.rds.aws_secretsmanager_secret_version.superuser module.rds.aws_secretsmanager_secret_version.superuser
执行后,检查目标状态文件,确认已包含该资源的状态记录。
2. 获取正确的Secret VersionID
通过AWS CLI查询目标Secret的所有版本信息:
aws secretsmanager list-secret-version-ids --secret-id arn:aws:secretsmanager:eu-west-2:**********:secret:rds-superuser-TJ*******-M****B
在返回结果中找到对应版本的VersionId(例如terraform-202400000000001d)以及关联的VersionStages。
3. 对齐Terraform配置与实际资源
检查aws_secretsmanager_secret_version的资源配置,确保:
secret_string的内容与AWS上的Secret值一致(如果是静态配置);version_stages列表包含实际的版本阶段(比如["AWSCURRENT"])。
4. 正确执行导入命令(状态迁移无效时使用)
导入时需带上模块前缀,确保资源被识别到模块命名空间下:
terraform import module.rds.aws_secretsmanager_secret_version.superuser 'arn:aws:secretsmanager:eu-west-2:**********:secret:rds-superuser-TJ*******-M****B|terraform-202400000000001d'
5. 验证结果
重新执行terraform plan,确认资源不再显示为需要重建。
内容的提问来源于stack exchange,提问作者Johana
相关产品推荐
相关产品推荐

