共有 Key Management Service(共有 KMS または KMS 1.0 とも呼ばれます)を KMS 3.0 インスタンスに移行すると、キーとシークレットは特定の KMS インスタンスに関連付けられます。つまり、KMS インスタンス ID 属性が追加されます。共有 KMS が Terraform 管理である場合、追加されたインスタンス ID 属性により、Terraform 構成の変更が必要になります。変更しない場合、移行は失敗します。このトピックでは、Terraform 構成を変更する方法について説明します。
Terraform 構成を変更する理由
移行が完了した後、terraform plan コマンドと terraform apply コマンドを実行すると、Terraform は属性の変更を検出し、構成に合わせてリソースを更新しようとします。その結果、移行された Customer Master Keys (CMKs) またはシークレットが解放され、新しい CMK またはシークレットが作成されます。移行後にこれを行うには、既存の Terraform 構成を更新する必要があります。
ソリューションの概要
2 つのソリューションで、移行後に terraform plan コマンドと terraform apply コマンドを実行したときにリソースが解放される問題に対処できます。シナリオに合ったソリューションを次のように選択します。
ソリューション 1:既存の構成を維持する: 既存の構成を維持する
このソリューションは、新しい変更を適用せずに既存の構成を維持します。
ignore_changes = ["dkms_instance_id", "automatic_rotation", "rotation_interval"]をalicloud_kms_keyリソースとalicloud_kms_secretリソースに追加します。これにより、Terraform がこれらの変更を検出するのを防ぎます。互換性: Terraform バージョン 1.235.0 以前で動作します。それ以降のバージョンでは、
ignore_changes引数からdkms_instance_idを削除してください。ハードウェアからソフトウェアへのキーの移行:キーをハードウェア保護レベルからソフトウェア保護レベルに移行する場合は、
ignore_changes引数にprotection_levelを追加します。ignore_changes = ["dkms_instance_id", "automatic_rotation", "rotation_interval", "protection_level"]。
ソリューション 2:新しい変更を採用する: 新しい変更を採用する
このソリューションは、Terraform 構成に
dkms_instance_id関連の引数を追加することで変更を組み込みます。これにより、Terraform は移行されたキーとシークレットのdkms_instance_idを識別し、新しい KMS インスタンス内でalicloud_kms_keyリソースとalicloud_kms_secretリソースを正しく構成できます。これにより、Alibaba Cloud キーとシークレットのシームレスな移行が保証されます。
手順
ソリューション 1:既存の構成を維持する
ignore_changes = [dkms_instance_id,automatic_rotation,rotation_interval]を alicloud_kms_key リソースと alicloud_kms_secret リソースに追加します。移行前にキーとシークレットのローテーションが無効になっている場合は、移行後に有効にします。
詳細については、「キーのローテーション」および「シークレットのローテーション」をご参照ください。
キーとシークレットのデフォルトポリシーを構成します。
詳細については、「キーポリシーの構成」および「シークレットポリシーの構成」をご参照ください。
alicloud_kms_key リソース構成の変更例
次の例では、90 日間隔のキーローテーションが有効になっており、デフォルトのキーポリシーが設定されています。各パラメーターの詳細については、「alicloud_kms_key」をご参照ください。
resource "alicloud_kms_key" "default_key_encrypt_decrypt" {
# これを追加する
lifecycle {
ignore_changes = [dkms_instance_id,automatic_rotation,rotation_interval]
}
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
# 追加の終わり
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 リソース構成の変更例
次の例では、シークレットローテーションは有効になっておらず、デフォルトのシークレットポリシーが設定されています。
各パラメーターの詳細については、「alicloud_kms_secret」をご参照ください。
resource "alicloud_kms_secret" "kms_secret_general" {
# これを追加する
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
# 追加の終わり
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"
}ソリューション 2:新しい変更を採用する
ルートディレクトリにある
main.tfファイルを更新します。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を locals ブロックに追加します。dkms_instance_id = var.dkms_instance_idを alicloud_kms_key リソースに追加します。dkms_instance_id = var.dkms_instance_idを alicloud_kms_secret リソースに追加します。
例:
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 # これを追加する dkms_instance_id = var.dkms_instance_id # 追加の終わり } 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 # これを追加する dkms_instance_id = var.dkms_instance_id # 追加の終わり secret_data = var.secret_data secret_data_type =var.secret_data_type enable_automatic_rotation = var.enable_automatic_rotation }ルートディレクトリにある
variable.tfファイルでdkms_instance_id変数を定義します。重要デフォルト 値は、""(空の文字列)または null に設定する必要があります。
# module default variable variable "dkms_instance_id" { description = "KMS インスタンスの ID。" 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