You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform导入AWS Secrets Manager版本后AWSCURRENT标签异常问题

问题描述

AWS Secrets Manager维护秘密版本管理系统,更新秘密值或轮换时会创建新版本。将现有AWS秘密纳入Terraform管理的步骤如下:

  1. 声明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)
}
  1. 执行导入操作:
  • 导入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且创建了新版本?


原因分析与解决方案

原因

  1. Terraform资源核心逻辑:aws_secretsmanager_secret_version的职责是确保配置中定义的secret_string对应的版本处于AWSCURRENT状态,而非绑定固定的VersionId或标签。导入后Terraform会对比本地配置值与远程导入版本的实际值,若存在差异(哪怕是JSON格式的空格、键顺序差异),就会创建新版本并转移AWSCURRENT标签。
  2. 导入版本匹配问题:用AWSCURRENT作为导入标识符时,Terraform仅记录该标签对应的当前值,但如果本地jsonencode后的字符串与远程原版本的JSON格式不一致(比如jsonencode自动排序键,原秘密JSON键无序),Terraform会判定值不匹配,触发新版本创建。
  3. 无版本保留逻辑:该资源没有“保留现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:09:26