All Products
Search
Document Center

Key Management Service:Perbarui konfigurasi Terraform setelah migrasi

Last Updated:Apr 01, 2026

Saat Anda melakukan migrasi Key Management Service (KMS 1.0) bersama ke KMS 3.0, setiap kunci dan rahasia akan dikaitkan dengan instans KMS tertentu, sehingga menambahkan atribut dkms_instance_id. Jika Anda mengelola resource KMS menggunakan Terraform, perbarui konfigurasi Anda sebelum menjalankan terraform plan atau terraform apply. Tanpa pembaruan ini, Terraform akan mendeteksi atribut baru tersebut, menghapus Customer Master Keys (CMK) dan rahasia yang telah dimigrasi, lalu membuat ulang—yang berpotensi menyebabkan kehilangan data.

Pilih solusi

SituasiSolusi yang direkomendasikan
Perubahan minimal diperlukan; Terraform tidak perlu melacak asosiasi instans KMSSolusi 1: Pertahankan konfigurasi yang ada
Konfigurasi Terraform harus sepenuhnya mencerminkan asosiasi instans KMS setelah migrasiSolusi 2: Gunakan konfigurasi baru

Solusi 1: Pertahankan konfigurasi yang ada

Tambahkan blok lifecycle dengan ignore_changes ke setiap resource alicloud_kms_key dan alicloud_kms_secret. Hal ini memberi tahu Terraform untuk mengabaikan atribut dkms_instance_id selama operasi plan dan apply, sehingga mencegah resource dihapus dan dibuat ulang.

Penting

Solusi ini berfungsi dengan versi provider Terraform 1.235.0 dan sebelumnya. Untuk versi yang lebih baru, hapus dkms_instance_id dari daftar ignore_changes.

Jika Anda melakukan migrasi kunci dari tingkat proteksi hardware ke software, tambahkan juga protection_level ke dalam daftar ignore_changes: ignore_changes = [dkms_instance_id, automatic_rotation, rotation_interval, protection_level].

Langkah-langkah

  1. Tambahkan blok lifecycle berikut ke setiap resource alicloud_kms_key dan alicloud_kms_secret:

    lifecycle {
      ignore_changes = [dkms_instance_id, automatic_rotation, rotation_interval]
    }
  2. Jika rotasi dinonaktifkan pada kunci atau rahasia apa pun sebelum migrasi, aktifkan kembali setelah migrasi. Melewatkan langkah ini akan menyebabkan rotasi tetap dinonaktifkan secara permanen pada resource yang terdampak.

  3. Konfigurasikan kebijakan default untuk kunci dan rahasia Anda. Tanpa kebijakan tersebut, akses ke resource hanya mengikuti kebijakan RAM tingkat akun.

Contoh: alicloud_kms_key

Contoh berikut mengaktifkan rotasi kunci dengan interval 90 hari dan menetapkan kebijakan kunci default. Baris yang ditandai dengan # Add this merupakan penambahan baru. Untuk semua parameter yang didukung, lihat 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"
  }
}

Contoh: alicloud_kms_secret

Contoh berikut menonaktifkan rotasi rahasia dan menetapkan kebijakan rahasia default. Baris yang ditandai dengan # Add this merupakan penambahan baru. Untuk semua parameter yang didukung, lihat 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"
}

Solusi 2: Gunakan konfigurasi baru

Tambahkan dkms_instance_id sebagai argumen eksplisit dalam konfigurasi Terraform Anda. Terraform membaca ID instans dari resource yang telah dimigrasi dan mengaitkan resource alicloud_kms_key dan alicloud_kms_secret dengan instans KMS 3.0 secara tepat.

Langkah-langkah

  1. Perbarui main.tf di direktori root dengan tiga penambahan berikut: Contoh berikut menunjukkan ketiga penambahan tersebut dalam konteksnya. Baris yang ditandai dengan # Add this merupakan penambahan baru:

    • Pada blok locals, tambahkan: ``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 ``

    • Pada resource alicloud_kms_key, tambahkan: ``hcl dkms_instance_id = var.dkms_instance_id ``

    • Pada resource alicloud_kms_secret, tambahkan: ``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. Definisikan variabel dkms_instance_id dalam file variable.tf di direktori root.

    Penting

    Tetapkan nilai default sebagai "" (string kosong) atau null. Nilai default lainnya akan menyebabkan Terraform mencoba mengaitkan semua kunci dan rahasia yang ada ke instans yang tidak ada.

    # Module default variable
    variable "dkms_instance_id" {
      description = "The ID of the KMS instance."
      type        = string
      default     = ""
    }
  3. Pada modul kunci, tetapkan ID instans, konfigurasikan kebijakan kunci, dan aktifkan rotasi sesuai kebutuhan. Contoh berikut menggunakan instans KMS kst-hkk66e****boq8qsxxgxd, mengaktifkan rotasi dengan interval 90 hari, dan menetapkan kebijakan kunci default. Untuk kebijakan kunci kustom, lihat Key policy overview. Sesuaikan nilai-nilainya agar sesuai dengan konfigurasi Anda.

    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. Pada modul rahasia, tetapkan ID instans, konfigurasikan kebijakan rahasia, dan aktifkan rotasi sesuai kebutuhan. Contoh berikut menggunakan instans KMS kst-hkk66e****boq8qsxxgxd, menonaktifkan rotasi, dan menetapkan kebijakan rahasia default. Untuk kebijakan rahasia kustom, lihat Secret policy overview. Sesuaikan nilai-nilainya agar sesuai dengan konfigurasi Anda.

    # 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

Langkah selanjutnya