Terraform导入AWS Secrets Manager版本后AWSCURRENT标签异常问题
问题描述
AWS Secrets Manager维护秘密版本管理系统,更新秘密值或轮换时会创建新版本。将现有AWS秘密纳入Terraform管理的步骤如下:
- 声明Terraform资源:
resource "aws_secretsmanager_secret" "secret" { name = var.secret_name description = var.secret_description kms_key_id = aws_kms_key.main.id recovery_window_in_days = var.recovery_window_in_days tags = var.secret_tags policy = data.aws_iam_policy_document.secret_access_policy.json } // AWS secrets manager secret version resource "aws_secretsmanager_secret_version" "secret" { secret_id = aws_secretsmanager_secret.secret.id secret_string = jsonencode(var.secret_name_in_secrets_file) }
- 执行导入操作:
- 导入Secret到状态:
terraform import module.<module_name>.aws_secretsmanager_secret.secret arn:aws:secretsmanager:<region>:<account_id>:secret:<secret_name>-<hash_value>
- 导入Secret Version到状态:
terraform import module.<module_name>.aws_secretsmanager_secret_version.secret arn:aws:secretsmanager:<region>:<account_id>:secret:<secret_name>-<hash_value>|AWSCURRENT
原本预期Terraform计划仅修改资源策略,但实际Terraform尝试销毁并重建秘密版本。执行计划后,原本关联AWSCURRENT标签的导入版本变为AWSPREVIOUS标签,同时创建了新的AWSCURRENT版本。
导入前版本信息:
{ "Versions": [ { "VersionId": "initial-current", "VersionStages": [ "AWSCURRENT" ], "LastAccessedDate": "xxxx", "CreatedDate": "xxx" }, { "VersionId": "initial-previous", "VersionStages": [ "AWSPREVIOUS" ], "LastAccessedDate": "xxxx", "CreatedDate": "xxxx" } ], "ARN": "xxxx", "Name": "xxxx" }
导入并应用后版本信息:
{ "Versions": [ { "VersionId": "post-import-current", "VersionStages": [ "AWSCURRENT" ], "LastAccessedDate": "xxxx", "CreatedDate": "xxx" }, { "VersionId": "initial-current", "VersionStages": [ "AWSPREVIOUS" ], "LastAccessedDate": "xxxx", "CreatedDate": "xxxx" } ], "ARN": "xxxx", "Name": "xxxx" }
疑问:为何在未更新值或轮换的情况下,导入后initial-current版本变为AWSPREVIOUS且创建了新版本?
原因分析与解决方案
原因
- Terraform资源核心逻辑:
aws_secretsmanager_secret_version的职责是确保配置中定义的secret_string对应的版本处于AWSCURRENT状态,而非绑定固定的VersionId或标签。导入后Terraform会对比本地配置值与远程导入版本的实际值,若存在差异(哪怕是JSON格式的空格、键顺序差异),就会创建新版本并转移AWSCURRENT标签。 - 导入版本匹配问题:用
AWSCURRENT作为导入标识符时,Terraform仅记录该标签对应的当前值,但如果本地jsonencode后的字符串与远程原版本的JSON格式不一致(比如jsonencode自动排序键,原秘密JSON键无序),Terraform会判定值不匹配,触发新版本创建。 - 无版本保留逻辑:该资源没有“保留现有AWSCURRENT版本”的设计,只要配置值与当前AWSCURRENT版本的值不匹配,就会生成新版本,将原版本标记为AWSPREVIOUS。
解决方案
1. 验证配置值与远程值完全一致
通过AWS CLI获取原版本的实际内容,对比本地配置的编码结果:
# 获取原initial-current版本的秘密内容 aws secretsmanager get-secret-value --secret-id <secret-arn> --version-id initial-current
将输出的SecretString与本地jsonencode(var.secret_name_in_secrets_file)的结果做精确对比,确保格式(空格、键顺序)和内容完全一致。
2. 重新导入具体VersionId
如果值一致但计划仍显示要创建新版本,需重新导入具体的VersionId而非AWSCURRENT标签:
# 先移除现有状态中的版本资源 terraform state rm module.<module_name>.aws_secretsmanager_secret_version.secret # 重新导入指定VersionId的版本 terraform import module.<module_name>.aws_secretsmanager_secret_version.secret arn:aws:secretsmanager:<region>:<account_id>:secret:<secret_name>-<hash_value>|initial-current
3. 仅管理Secret元数据(可选)
如果不需要Terraform管理秘密值的内容,仅需管理Secret的策略、KMS密钥等元数据,可直接移除aws_secretsmanager_secret_version资源。此时Terraform不会干预秘密的版本和值,仅维护Secret本身的属性。
内容的提问来源于stack exchange,提问作者Abhishek Malik
相关产品推荐
相关产品推荐

