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

Key Management Service:Terraform 構成の移行後の更新

最終更新日:Apr 01, 2026

共有 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_idignore_changes のリストから除外してください。

ハードウェア保護レベルからソフトウェア保護レベルへのキー移行を行う場合、protection_levelignore_changes のリストに追加してください:ignore_changes = [dkms_instance_id, automatic_rotation, rotation_interval, protection_level]

操作手順

  1. lifecycle ブロックを、alicloud_kms_key および alicloud_kms_secret リソースに以下のように追加します:

    lifecycle {
      ignore_changes = [dkms_instance_id, automatic_rotation, rotation_interval]
    }
  2. 移行前にいずれかのキーまたはシークレットでローテーションが無効化されていた場合、移行後に再度有効化してください。このステップをスキップすると、該当するリソースのローテーションは永続的に無効化されたままになります。

  3. キーおよびシークレットのデフォルトポリシーを設定してください。ポリシーが設定されていない場合、リソースへのアクセスはアカウントレベルの 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 インスタンスと正しく関連付けます。

操作手順

  1. ルートディレクトリの 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 : null

    • alicloud_kms_key リソース内に追加:hcl dkms_instance_id = var.dkms_instance_id

    • alicloud_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
    }
  2. ルートディレクトリの variable.tfdkms_instance_id 変数を定義します。

    重要

    デフォルト値は ""(空文字列)または null のいずれかに設定してください。それ以外のデフォルト値を設定すると、Terraform が存在しないインスタンスに既存のすべてのキーおよびシークレットをバインドしようとするため、エラーが発生します。

    # Module default variable
    variable "dkms_instance_id" {
      description = "The ID of the KMS instance."
      type        = string
      default     = ""
    }
  3. キー・モジュール内で、インスタンス 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
  4. シークレット・モジュール内で、インスタンス 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

次のステップ