全部產品
Search
文件中心

Key Management Service:Terraform情境下遷移後修改配置

更新時間:Mar 17, 2026

本文介紹Terraform情境下,遷移後如何修改Terraform配置。

為什麼需要修改Terraform配置

遷移後資源屬性會發生如下變化:

  • 當您將使用者主要金鑰(CMK)和憑據從共用版KMS(KMS 1.0)遷移到KMS 3.0執行個體中時,密鑰和憑據會歸屬於特定的KMS執行個體,因此遷移後會增加一個KMS執行個體ID屬性。

  • 保護層級的為HSM的密鑰,如果遷移到軟體密鑰管理執行個體,保護層級會變更為SOFTWARE。

當Terraform檢測到代碼所描述的配置與實際基礎設施對象存在差異時,便會制定變更計劃以更新基礎設施對象,從而使其與代碼描述的狀態相匹配。這會導致遷移的CMK或憑據被釋放,並建立一個新的CMK或憑據。為瞭解決這一問題,遷移完成後,您需要按照以下步驟修改現有的Terraform配置。

修改Terraform配置方案

KMS提供以下兩種方案修改Terraform配置,請根據您的情境選擇合適的方案。

對比項

方案一:增加ignore_changes(推薦)

方案二:增加dkms_instance_id

實現方式

lifecycle中添加ignore_changes,讓Terraform在執行計畫(plan)和應用(apply)操作時忽略遷移引起的屬性變更。

在資源中顯式聲明dkms_instance_id,使Terraform配置與實際狀態保持一致。

解決dkms_instance_id變更

支援

支援

解決protection_level(密鑰保護層級)變更

支援

不支援

代碼修改

無需修改原有業務代碼。

需修改業務代碼。

版本相容性

適用於Terraform 1.235.0及之前的版本。

說明

Terraform 1.235.0之後的版本無需忽略dkms_instance_id,可以從 ignore_changes 參數中移除 dkms_instance_id

所有版本均適用。

適用情境

  • HSM密鑰遷移到軟體密鑰管理執行個體:密鑰的保護層級將更改為Software。

  • 業務代碼變更困難。

  • 保護層級未變化的情境。

  • 需要Terraform配置與實際狀態完全一致。

方案一:增加ignore_changes語句

在"alicloud_kms_key"中執行以下操作:

  1. 增加ignore_changes = [dkms_instance_id,automatic_rotation,rotation_interval,protection_level]語句。

  2. 如果密鑰遷移前關閉了輪轉,遷移完成後請開啟密鑰輪轉。輪轉的相關介紹,請參見密鑰輪轉

  3. 為密鑰設定預設策略。如果您需要自訂策略,請參見密鑰策略概述

樣本中為密鑰開啟了輪轉且輪轉周期為90天,為密鑰設定了預設密鑰策略。具體使用時,請以您的實際業務為準。各配置項的詳細介紹,請參見alicloud_kms_key

resource "alicloud_kms_key" "default_key_encrypt_decrypt" {
 
 #   add this
  lifecycle {
    ignore_changes = [dkms_instance_id,automatic_rotation,rotation_interval,protection_level]
  }
  automatic_rotation = "Enabled"
  rotation_interval = "90d"
  policy = <<EOF
    {
        "Statement": [
            {
                "Action": [
                    "kms:*"
                ],
                "Effect": "Allow",
                "Principal": {
                    "RAM": [
                        "acs:ram::5135****76002605:*"
                    ]
                },
                "Resource": [
                    "*"
                ],
                "Sid": "kms default key policy"
            }
        ],
        "Version": "1"
    }
  EOF
  #   end of add
  
  description = "test tf"
  key_usage = "ENCRYPT/DECRYPT"
  key_spec = "Aliyun_AES_256"
  origin = "Aliyun_KMS"
  pending_window_in_days = 7
  tags = {
      "Environment" = "test"
      "Name" = "KMS-01"
      "SupportTeam" = "PlatformEngineering"
      "Contact" = "group@example.com"
    }
}

在"alicloud_kms_secret"中執行以下操作:

  1. 增加ignore_changes = [dkms_instance_id]語句。

  2. 如果憑據遷移前關閉了輪轉,遷移完成後請開啟憑據輪轉。

  3. 為憑據設定預設策略。如果您需要自訂策略,請參見憑據策略概述

樣本中憑據未開啟輪轉,憑據設定了預設憑據策略。具體使用時,請以您的實際業務為準。各配置項的詳細介紹,請參見alicloud_kms_secret

resource "alicloud_kms_secret" "kms_secret_general" {
 
  #   add this
 lifecycle {
    ignore_changes = [dkms_instance_id]
      }
 enable_automatic_rotation = false   
 policy = <<EOF
    {
        "Statement": [
            {
                "Action": [
                    "kms:*"
                ],
                "Effect": "Allow",
                "Principal": {
                    "RAM": [
                        "acs:ram::5135****76002605:*"
                    ]
                },
                "Resource": [
                    "*"
                ],
                "Sid": "kms default secret policy"
            }
        ],
        "Version": "1"
    }
  EOF     
  #   end of add
  
  secret_name = "kms_secret_general1"
  description = "secret_data_kms_secret_general"
  secret_type = "Generic"
  force_delete_without_recovery = true
  encryption_key_id = alicloud_kms_key.default_key_encrypt_decrypt.id
  version_id = "v1"
  secret_data_type ="text"
  secret_data = "secret_data_kms_secret_general1"
}

方案二:增加dkms_instance_id相關語句

以使用者已把CMK fecbd43a-********-9c051c8cc26d 遷移到KMS執行個體(kst-hkk66e****boq8qsxxgxd)為例進行介紹。

  1. 在根目錄的main.tf檔案中增加以下代碼。

    1. locals中增加dkms_instance_id = var.use_existing_key == true || alicloud_kms_key.kms.0.dkms_instance_id != "" ? alicloud_kms_key.kms.0.dkms_instance_id : null

    2. "alicloud_kms_key"中增加 dkms_instance_id = var.dkms_instance_id

    3. "alicloud_kms_secret"中增加 dkms_instance_id = var.dkms_instance_id

    樣本如下:

    locals {
      this_kms_key_id    = var.use_existing_key == true || var.existing_key_id != "" ? var.existing_key_id : concat(alicloud_kms_key.kms.*.id, [""])[0]
      dkms_instance_id    = var.use_existing_key == true || alicloud_kms_key.kms.0.dkms_instance_id != "" ? alicloud_kms_key.kms.0.dkms_instance_id : null
      policy    = var.use_existing_key == true || alicloud_kms_key.kms.0.policy != "" ? alicloud_kms_key.kms.0.policy : null
      automatic_rotation= var.use_existing_key == true || alicloud_kms_key.kms.0.automatic_rotation != "" ? alicloud_kms_key.kms.0.automatic_rotation : null
      rotation_interval= var.automatic_rotation == "Enabled" || alicloud_kms_key.kms.0.rotation_interval != "" ? alicloud_kms_key.kms.0.rotation_interval : null
      secret_name = var.secret == true ||alicloud_kms_secret.kms.0.secret_name != "" ? alicloud_kms_secret.kms.0.secret_name : null
      secret_type = var.secret == true ||alicloud_kms_secret.kms.0.secret_type != "" ? alicloud_kms_secret.kms.0.secret_type : null
      version_id = var.secret == true ||alicloud_kms_secret.kms.0.version_id != "" ? alicloud_kms_secret.kms.0.version_id : null
      force_delete_without_recovery = var.secret == true ||alicloud_kms_secret.kms.0.force_delete_without_recovery != "" ? alicloud_kms_secret.kms.0.force_delete_without_recovery : null
      secret_data = var.secret == true ||alicloud_kms_secret.kms.0.secret_data != "" ? alicloud_kms_secret.kms.0.secret_data : null
      secret_data_type = var.secret == true ||alicloud_kms_secret.kms.0.secret_data_type != "" ? alicloud_kms_secret.kms.0.secret_data_type : null
      enable_automatic_rotation = var.secret == true ||alicloud_kms_secret.kms.0.enable_automatic_rotation != "" ? alicloud_kms_secret.kms.0.enable_automatic_rotation : null
    }
    
    resource "alicloud_kms_key" "kms" {
      count                   = var.use_existing_key == true ? 0 : var.create_kms ? 1 : 0
      description             = var.description
      key_usage               = var.key_usage
      pending_window_in_days = var.pending_window_in_days
      status              = var.status
      policy = var.policy
      automatic_rotation = var.automatic_rotation
      rotation_interval = var.rotation_interval
      #   add this
      dkms_instance_id    = var.dkms_instance_id
      #   end of add
    }
    
    resource "alicloud_kms_secret" "kms" {
      count              = var.existing_key_id != "" ? var.existing_key_id : var.encrypt ? 1 : 0
      secret_name                   = var.secret_name
      encryption_key_id             = concat(alicloud_kms_key.kms.*.id, [""])[0]
      secret_type                   = var.secret_type
      version_id                    = var.version_id
      force_delete_without_recovery = var.force_delete_without_recovery
      #   add this
      dkms_instance_id    = var.dkms_instance_id
      #   end of add
      secret_data = var.secret_data
      secret_data_type =var.secret_data_type
      enable_automatic_rotation = var.enable_automatic_rotation
    }
    
  2. 在根目錄variable.tf檔案中定義dkms_instance_id變數。

    重要

    default取值必須為""null

    # module default variable
    variable "dkms_instance_id" {
      description = "The ID of the KMS instance."
      type        = string
      default     = ""
    }

    image

  3. 在密鑰相關模組下增加執行個體ID的資訊、設定密鑰策略,並根據業務需要決定是否開啟輪轉。

    • 輪轉周期:樣本中輪轉周期為90天,請根據實際情況修改。

    • KMS執行個體ID:樣本為kst-hkk66e****boq8qsxxgxd,請根據實際情況修改。

    • 密鑰策略:樣本提供的為預設策略,如果您需要自訂策略,請參見密鑰策略概述

      automatic_rotation = "Enabled"
      rotation_interval = "90d"
      dkms_instance_id        = "kst-hkk66e****boq8qsxxgxd"
      policy = <<EOF
        {
            "Statement": [
                {
                    "Action": [
                        "kms:*"
                    ],
                    "Effect": "Allow",
                    "Principal": {
                        "RAM": [
                            "acs:ram::5135****76002605:*"
                        ]
                    },
                    "Resource": [
                        "*"
                    ],
                    "Sid": "kms default key policy"
                }
            ],
            "Version": "1"
        }
      EOF

    image

  4. 在憑據相關模組下增加執行個體ID的資訊、設定憑據策略,並根據業務需要決定是否開啟輪轉。

    • 輪轉周期:樣本中未開啟輪轉,請根據實際情況修改。

    • KMS執行個體ID:樣本為kst-hkk66e****boq8qsxxgxd,請根據實際情況修改。

    • 憑據策略:樣本提供的為預設策略,如果您需要自訂策略,請參見憑據策略概述

       #secret
        secret_data = "secret_data_kms_secret_general1"
        secret_name = "kms_secret_general1"
        version_id = "v1"
        secret_data_type ="text"
        secret_type = "Generic"
        enable_automatic_rotation = false
        dkms_instance_id        = "kst-hkk66e****boq8qsxxgxd"
        policy = <<EOF
          {
              "Statement": [
                  {
                      "Action": [
                          "kms:*"
                      ],
                      "Effect": "Allow",
                      "Principal": {
                          "RAM": [
                              "acs:ram::5135****76002605:*"
                          ]
                      },
                      "Resource": [
                          "*"
                      ],
                      "Sid": "kms default secret policy"
                  }
              ],
              "Version": "1"
          }
        EOF   
        force_delete_without_recovery = true