共有 Key Management Service (KMS 1.0) を KMS 3.0 に移行すると、各キーおよびシークレットは特定の KMS インスタンスに関連付けられ、dkms_instance_id 属性が追加されます。Terraform を使用して KMS リソースを管理している場合、terraform plan または terraform apply を実行する前に、構成を更新してください。更新を行わないと、Terraform が新しい属性を検出し、移行済みのカスタマーマスターキー (CMK) およびシークレットを削除して再作成するため、データ損失が発生します。
ソリューションの選択
| 状況 | 推奨されるソリューション |
|---|---|
| 最小限の変更で対応可能。Terraform が KMS インスタンスとの関連付けを追跡する必要がない | ソリューション 1:既存の構成を維持 |
| 移行後に、Terraform 構成が KMS インスタンスとの関連付けを完全に反映する必要がある | ソリューション 2:新しい構成を採用 |
ソリューション 1:既存の構成を維持
lifecycle ブロックに ignore_changes を指定し、各 alicloud_kms_key および alicloud_kms_secret リソースに追加します。これにより、plan および apply 操作時に dkms_instance_id 属性が無視され、リソースが削除・再作成されることを防ぎます。
このソリューションは Terraform プロバイダー バージョン 1.235.0 以前で動作します。それ以降のバージョンでは、dkms_instance_id を ignore_changes のリストから除外してください。
ハードウェア保護レベルからソフトウェア保護レベルへのキー移行を行う場合、protection_levelもignore_changesのリストに追加してください:ignore_changes = [dkms_instance_id, automatic_rotation, rotation_interval, protection_level]。
操作手順
各
lifecycleブロックを、alicloud_kms_keyおよびalicloud_kms_secretリソースに以下のように追加します:lifecycle { ignore_changes = [dkms_instance_id, automatic_rotation, rotation_interval] }移行前にいずれかのキーまたはシークレットでローテーションが無効化されていた場合、移行後に再度有効化してください。このステップをスキップすると、該当するリソースのローテーションは永続的に無効化されたままになります。
キーおよびシークレットのデフォルトポリシーを設定してください。ポリシーが設定されていない場合、リソースへのアクセスはアカウントレベルの RAM ポリシーのみに制限されます。
例:alicloud_kms_key
以下の例では、90 日間隔でのキーのローテーションを有効化し、デフォルトのキー・ポリシーを設定しています。# Add this とマークされた行が新規追加部分です。サポートされているすべてのパラメーターについては、「alicloud_kms_key」をご参照ください。
resource "alicloud_kms_key" "default_key_encrypt_decrypt" {
# Add this
lifecycle {
ignore_changes = [dkms_instance_id, automatic_rotation, rotation_interval]
}
# End of added block
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
以下の例では、シークレットのローテーションを無効化し、デフォルトのシークレット・ポリシーを設定しています。# Add this とマークされた行が新規追加部分です。サポートされているすべてのパラメーターについては、「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 added block
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:新しい構成を採用
Terraform 構成に dkms_instance_id を明示的な引数として追加します。Terraform は移行済みリソースからインスタンス ID を読み取り、alicloud_kms_key および alicloud_kms_secret リソースを KMS 3.0 インスタンスと正しく関連付けます。
操作手順
ルートディレクトリの
main.tfを、以下の 3 つの追加項目で更新します。次の例では、すべての追加項目を文脈付きで示しています。# Add thisとマークされた行が新規追加部分です:localsブロック内に追加:hcl dkms_instance_id = var.use_existing_key == true || alicloud_kms_key.kms.0.dkms_instance_id != "" ? alicloud_kms_key.kms.0.dkms_instance_id : nullalicloud_kms_keyリソース内に追加:hcl dkms_instance_id = var.dkms_instance_idalicloud_kms_secretリソース内に追加:hcl 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] # Add this 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 # End of add 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変数を定義します。重要デフォルト値は
""(空文字列)またはnullのいずれかに設定してください。それ以外のデフォルト値を設定すると、Terraform が存在しないインスタンスに既存のすべてのキーおよびシークレットをバインドしようとするため、エラーが発生します。# Module default variable variable "dkms_instance_id" { description = "The ID of the KMS instance." type = string default = "" }キー・モジュール内で、インスタンス ID を設定し、必要に応じてキー・ポリシーを構成し、ローテーションを有効化します。次の例では、KMS インスタンス
kst-hkk66e****boq8qsxxgxdを使用し、90 日間隔でローテーションを有効化し、デフォルトのキー・ポリシーを設定しています。カスタムのキー・ポリシーについては、「キー・ポリシーの概要」をご参照ください。ご使用環境に合わせて値を調整してください。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 インスタンス
kst-hkk66e****boq8qsxxgxdを使用し、ローテーションを無効化し、デフォルトのシークレット・ポリシーを設定しています。カスタムのシークレット・ポリシーについては、「シークレット・ポリシーの概要」をご参照ください。ご使用環境に合わせて値を調整してください。# Secret configuration 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" force_delete_without_recovery = true policy = <<EOF { "Statement": [ { "Action": [ "kms:*" ], "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::5135****76002605:*" ] }, "Resource": [ "*" ], "Sid": "kms default secret policy" } ], "Version": "1" } EOF