本文介紹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 |
實現方式 | 在 | 在資源中顯式聲明 |
解決 | 支援 | 支援 |
解決 | 支援 | 不支援 |
代碼修改 | 無需修改原有業務代碼。 | 需修改業務代碼。 |
版本相容性 | 適用於Terraform 1.235.0及之前的版本。 說明 Terraform 1.235.0之後的版本無需忽略 | 所有版本均適用。 |
適用情境 |
|
|
方案一:增加ignore_changes語句
在"alicloud_kms_key"中執行以下操作:
增加
ignore_changes = [dkms_instance_id,automatic_rotation,rotation_interval,protection_level]語句。如果密鑰遷移前關閉了輪轉,遷移完成後請開啟密鑰輪轉。輪轉的相關介紹,請參見密鑰輪轉。
為密鑰設定預設策略。如果您需要自訂策略,請參見密鑰策略概述。
樣本中為密鑰開啟了輪轉且輪轉周期為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"中執行以下操作:
增加
ignore_changes = [dkms_instance_id]語句。如果憑據遷移前關閉了輪轉,遷移完成後請開啟憑據輪轉。
為憑據設定預設策略。如果您需要自訂策略,請參見憑據策略概述。
樣本中憑據未開啟輪轉,憑據設定了預設憑據策略。具體使用時,請以您的實際業務為準。各配置項的詳細介紹,請參見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)為例進行介紹。
在根目錄的
main.tf檔案中增加以下代碼。在
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。在
"alicloud_kms_key"中增加dkms_instance_id = var.dkms_instance_id。在
"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 }在根目錄
variable.tf檔案中定義dkms_instance_id變數。重要default取值必須為""或null。# module default variable variable "dkms_instance_id" { description = "The ID of the KMS instance." type = string default = "" }
在密鑰相關模組下增加執行個體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
在憑據相關模組下增加執行個體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