すべてのプロダクト
Search
ドキュメントセンター

Key Management Service:Terraform 管理の KMS の移行後の構成変更

最終更新日:Feb 20, 2025

共有 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:既存の構成を維持する

  1. ignore_changes = [dkms_instance_id,automatic_rotation,rotation_interval]alicloud_kms_key リソースと alicloud_kms_secret リソースに追加します。

  2. 移行前にキーとシークレットのローテーションが無効になっている場合は、移行後に有効にします。

    詳細については、「キーのローテーション」および「シークレットのローテーション」をご参照ください。

  3. キーとシークレットのデフォルトポリシーを構成します。

    詳細については、「キーポリシーの構成」および「シークレットポリシーの構成」をご参照ください。

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:新しい変更を採用する

  1. ルートディレクトリにある main.tf ファイルを更新します。

    1. dkms_instance_id = var.use_existing_key == true || alicloud_kms_key.kms.0.dkms_instance_id != "" ? alicloud_kms_key.kms.0.dkms_instance_id : nulllocals ブロックに追加します。

    2. dkms_instance_id = var.dkms_instance_idalicloud_kms_key リソースに追加します。

    3. dkms_instance_id = var.dkms_instance_idalicloud_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
    }
    
  2. ルートディレクトリにある variable.tf ファイルで dkms_instance_id 変数を定義します。

    重要

    デフォルト 値は、""(空の文字列)または null に設定する必要があります。

    # module default variable
    variable "dkms_instance_id" {
      description = "KMS インスタンスの ID。"
      type        = string
      default     = ""
    }

  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

  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