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

Key Management Service:移行後の Terraform 設定の更新

最終更新日:Aug 25, 2026

本トピックでは、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:ignore_changes の追加 (推奨)

ソリューション 2:dkms_instance_id の追加

仕組み

lifecycle ブロックに ignore_changes 引数を追加します。これにより、Terraform は、plan および apply 操作中に移行によって引き起こされる属性の変更を無視するようになります。

リソースの実際の状態と一致するように、リソース設定でdkms_instance_idを明示的に宣言します。

対応 dkms_instance_id の変更

はい

はい

対応する protection_level の変更

はい

いいえ

コードの変更

ビジネスロジックコードの変更を回避します。

ビジネスロジックコードの変更が必要です。

バージョンの互換性

Terraform プロバイダーのバージョン 1.235.0 以前で動作します。

説明

Terraform バージョン 1.235.0 以降では、dkms_instance_id を無視する必要はなくなりました。dkms_instance_id を ignore_changes パラメーターから削除できます。

すべてのプロバイダーバージョンで動作します。

ユースケース

  • HSM からソフトウェアキー管理インスタンスにキーを移行し、保護レベルを SOFTWARE に変更する場合。

  • ビジネスロジックコードの変更が困難な場合。

  • 保護レベルが変更されないシナリオ。

  • Terraform 設定をリソースの実際の状態と完全に同期させる必要がある場合。

ソリューション 1:ignore_changes の追加

alicloud_kms_key リソースについては、次の手順を実行します:

  1. ignore_changes = [dkms_instance_id,automatic_rotation,rotation_interval,protection_level] ステートメントを追加します。

  2. 移行前にキーのローテーションが無効になっていた場合は、移行完了後に有効にします。詳細については、「キーのローテーション」をご参照ください。

  3. デフォルトのキーポリシーを設定します。カスタムポリシーを作成するには、「キーポリシーの概要」をご参照ください。

次の例では、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 リソースについては、次の手順を実行します:

  1. ignore_changes = [dkms_instance_id] ステートメントを追加します。

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

  3. デフォルトのシークレットポリシーを設定します。カスタムポリシーを作成するには、「シークレットポリシーの概要」をご参照ください。

次の例では、シークレットのローテーションが無効になっており、デフォルトのシークレットポリシーが設定されています。ビジネス要件に合わせて設定を調整してください。各パラメーターの詳細については、「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 に移行した後に設定を更新する方法を示します。

  1. ルートディレクトリの main.tf ファイルに、次のコードを追加します。

    1. 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を追加します。

    2. "alicloud_kms_key" に、 dkms_instance_id = var.dkms_instance_id を追加します。

    3. "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
    }
    
  2. ルートディレクトリの 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
      #  追加ここまで
    }
  3. キーのモジュールでインスタンス 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 {
        # ...
      }
    }
  4. シークレットのモジュールでインスタンス 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