本トピックでは、Terraform 環境でのリソース移行後に Terraform 設定を更新する方法について説明します。
Terraform 設定を更新する理由
移行後、リソースの属性は次のように変更されます:
-
カスタマーマスターキー (CMK) またはシークレットを共有 Key Management Service (KMS) 1.0 インスタンスから KMS 3.0 インスタンスに移行すると、リソースは新しいインスタンスに関連付けられます。これにより、KMS インスタンス ID 属性がリソースに追加されます。
-
HSM 保護レベルのキーをソフトウェアキー管理インスタンスに移行すると、その保護レベルは
SOFTWAREに変更されます。
Terraform は、設定ファイルがインフラストラクチャの実際の状態と一致しないことを検出すると、それらを一致させるための実行計画を作成します。この不一致により、Terraform が移行された CMK またはシークレットを破棄して新しいものを作成する可能性があります。これを防ぐには、移行完了後に Terraform の設定を更新する必要があります。
Terraform の更新ソリューション
KMS は、Terraform 設定を更新するための 2 つのソリューションを提供します。ユースケースに最も適したソリューションを選択してください。
|
基準 |
ソリューション 1: |
ソリューション 2: |
|
仕組み |
|
リソースの実際の状態と一致するように、リソース設定で |
|
対応 |
はい |
はい |
|
対応する |
はい |
いいえ |
|
コードの変更 |
ビジネスロジックコードの変更を回避します。 |
ビジネスロジックコードの変更が必要です。 |
|
バージョンの互換性 |
Terraform プロバイダーのバージョン 1.235.0 以前で動作します。 説明
Terraform バージョン 1.235.0 以降では、 |
すべてのプロバイダーバージョンで動作します。 |
|
ユースケース |
|
|
ソリューション 1: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" {
# 以下を追加
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
# 追加ここまで
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" {
# 以下を追加
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: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 # 以下を追加 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変数を定義します。重要defaultの値は""またはnullである必要があります。# モジュールのデフォルト変数 variable "dkms_instance_id" { description = "KMS インスタンスの ID。" type = string default = "" }# variables.tf variable "create_kms" { } variable "use_existing_key" { description = "キーを作成するかどうか。false の場合、指定..." type = bool default = false } variable "dkms_instance_id" { description = "KMS インスタンスの ID。" type = string default = "" } variable "policy" { description = "キーポリシーの内容。値は..." type = string default = "" } variable "automatic_rotation" { description = "自動キーローテーションを有効にするかどうかを指定..." type = string default = "Disabled" } # main.tf 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.use_existing_key == true || alicloud_kms_key.kms.0.rotation_interval != "" ? alicloud_kms_key.kms.0.rotation_interval : null ciphertext_blob = var.decrypt == true || alicloud_kms_ciphertext.kms.0.ciphertext_blob != "" ? alicloud_kms_ciphertext.kms.0.ciphertext_blob : null encryption_context = var.decrypt == true || alicloud_kms_ciphertext.kms.0.encryption_context != "" ? alicloud_kms_ciphertext.kms.0.encryption_context : null plaintext = var.decrypt == true ||alicloud_kms_ciphertext.kms.0.plaintext != "" ? alicloud_kms_ciphertext.kms.0.plaintext : 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 # 追加ここまで } -
キーのモジュールでインスタンス ID を追加し、キーポリシーを設定し、要件に基づいてキーのローテーションを設定します。
-
ローテーション間隔:この例では 90 日間隔を使用しています。必要に応じてこの値を変更してください。
-
KMS インスタンス ID: 例は
kst-hkk66e****boq8qsxxgxdです。この例を実際の ID に置き換えてください。 -
キーポリシー:この例ではデフォルトのポリシーを提供しています。カスタムポリシーを作成するには、「キーポリシーの概要」をご参照ください。
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# examples/complete/main.tf 内 (モジュール呼び出し) module "kms" { source = "../.." region = var.region profile = var.profile #キー description = "Hello_KMS" pending_window_in_days = "7" status = "Enabled" automatic_rotation = "Enabled" rotation_interval = "90d" dkms_instance_id = "kst-hkk66e****boq8qsxxgxd" policy = <<EOF { "Statement": [ { "Action": [ "kms:*" ] } ], "Version": "1" } EOF } # main.tf 内 (リソースブロック) locals { rotation_interval= var.automatic_rotation == "Enabled" || ali... ciphertext_blob = var.decrypt == true || alicloud_kms_cip... encryption_context = var.decrypt == true || alicloud_kms_cip... plaintext = var.decrypt == true ||alicloud_kms... } resource "alicloud_kms_key" "kms" { count = var.use_existing_key == true ? 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 lifecycle { # ... } } -
-
シークレットのモジュールでインスタンス ID を追加し、シークレットポリシーを設定し、要件に基づいてローテーションを設定します。
-
ローテーション間隔:この例ではローテーションは有効になっていません。必要に応じてこの設定を変更してください。
-
KMS インスタンス ID: 例は
kst-hkk66e****boq8qsxxgxdです。実際のインスタンス ID に置き換えてください。 -
シークレットポリシー:この例ではデフォルトのポリシーを提供しています。カスタムポリシーを作成するには、「シークレットポリシーの概要」をご参照ください。
# シークレット 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
-