全部产品
Search
文档中心

Key Management Service:Buat rahasia menggunakan Terraform

更新时间:Jan 09, 2026

Anda dapat menggunakan Terraform untuk membuat dan mengelola secret. Topik ini memberikan contoh cara membuat secret.

Ikhtisar

Key Management Service (KMS) menggunakan kunci tertentu untuk mengenkripsi dan melindungi secret. Sebelum membuat secret, Anda harus terlebih dahulu membuat kunci. Untuk informasi selengkapnya tentang secret, lihat Ikhtisar Manajemen Secret.

Catatan

Kode contoh dalam topik ini mendukung eksekusi satu klik. Anda dapat menjalankan kode tersebut secara langsung. Jalankan kode

Prasyarat

  • Akun Alibaba Cloud memiliki izin penuh atas semua resource. Jika kredensial identitas Akun Alibaba Cloud bocor, resource Anda akan menghadapi risiko keamanan tinggi. Kami menyarankan agar Anda membuat pengguna Resource Access Management (RAM) beserta Pasangan Kunci Akses (AccessKey pair)-nya. Untuk informasi selengkapnya, lihat Buat RAM user dan Buat Pasangan Kunci Akses.

  • Berikan izin berikut kepada pengguna RAM: AliyunKMSFullAccess (untuk mengelola Key Management Service) dan AliyunRAMFullAccess (untuk mengelola Resource Access Management). Untuk informasi selengkapnya, lihat Berikan izin kepada RAM user.

    {
        "Version": "1",
        "Statement": [
            {
                "Action": "kms:*",
                "Resource": "*",
                "Effect": "Allow"
            },
            {
                "Action": "ram:CreateServiceLinkedRole",
                "Condition": {
                    "StringEquals": {
                        "ram:ServiceName": [
                            "secretsmanager-rds.kms.aliyuncs.com",
                            "keystore.kms.aliyuncs.com"
                        ]
                    }
                },
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
    }
  • Persiapkan lingkungan Terraform. Anda dapat menggunakan Terraform dengan salah satu cara berikut:

    Gunakan Terraform di Terraform Explorer: Alibaba Cloud menyediakan lingkungan online untuk Terraform sehingga Anda tidak perlu menginstal Terraform. Setelah login, Anda dapat langsung menggunakan dan menguji Terraform secara online. Metode ini cocok untuk skenario pengujian dan debugging Terraform yang cepat, nyaman, dan tanpa biaya.

    Cloud Shell: Komponen Terraform telah dipra-instal di Alibaba Cloud Cloud Shell dan kredensial identitas telah dikonfigurasi. Anda dapat langsung menjalankan perintah Terraform di Cloud Shell. Metode ini cocok untuk skenario akses dan penggunaan Terraform yang cepat, nyaman, dan berbiaya rendah.

    Instal dan konfigurasi Terraform di komputer Anda: Metode ini cocok untuk skenario dengan konektivitas jaringan yang buruk atau ketika Anda memerlukan lingkungan pengembangan kustom.

Penting

Pastikan versi Terraform Anda adalah 0.12.28 atau lebih baru. Untuk memeriksa versi, jalankan perintah terraform --version.

Resource yang digunakan

Buat secret menggunakan Terraform

Penting

Atur sensitive = true untuk secret_data (nilai secret) guna mencegah nilai secret sensitif dicetak di log atau pada Konsol. Untuk informasi selengkapnya, lihat Lindungi Variabel Input Sensitif.

Contoh ini menunjukkan cara membuat secret generik.

  1. Buat direktori kerja dan buat file konfigurasi bernama main.tf di dalam direktori tersebut.

    1. Tambahkan konten berikut ke main.tf. Sebelum melanjutkan, pastikan Anda telah membuat instans KMS dan kunci:

      Penting

      Kunci yang digunakan untuk mengenkripsi nilai secret harus berupa kunci simetris.

      Buat instans KMS:

      variable "region" {
        default = "cn-heyuan"
      }
      provider "alicloud" {
        region = var.region
      }
      variable "instance_name" {
        default = "tf-kms-vpc-172-16"
      }
      # Buat VPC.
      resource "alicloud_vpc" "vpc" {
        vpc_name   = var.instance_name
        cidr_block = "192.168.0.0/16"
      }
      # Buat vSwitch dengan blok CIDR 192.168.10.0/24.
      resource "alicloud_vswitch" "vsw" {
        vpc_id     = alicloud_vpc.vpc.id
        cidr_block = "192.168.10.0/24"
        zone_id    = "cn-heyuan-a"
        vswitch_name = "terraform-example-1"
      }
      # Buat vSwitch lain dengan blok CIDR 192.168.20.0/24.
      resource "alicloud_vswitch" "vsw1" {
        vpc_id     = alicloud_vpc.vpc.id
        cidr_block = "192.168.20.0/24"
        zone_id    = "cn-heyuan-b"
        vswitch_name = "terraform-example-2"
      }
      # Buat instans manajemen kunci perangkat lunak dan mulai dengan parameter jaringan.
      resource "alicloud_kms_instance" "default" {
        # Instans manajemen kunci perangkat lunak.
        product_version = "3"
        vpc_id          = alicloud_vpc.vpc.id
        # Tentukan zona untuk instans KMS. Gunakan ID zona yang diperoleh sebelumnya.
        zone_ids = [
          "cn-heyuan-a",
          "cn-heyuan-b",
        ]
        # ID vSwitch.
        vswitch_ids = [
          alicloud_vswitch.vsw.id,alicloud_vswitch.vsw1.id
        ]
        # Performa komputasi, jumlah kunci, jumlah secret, dan jumlah operasi manajemen akses.
        vpc_num    = "1"
        key_num    = "1000"
        secret_num = "100"
        spec       = "1000"
        # Opsional: Asosiasikan VPC lain dengan instans KMS.
        # Jika VPC dan VPC instans KMS berada di akun Alibaba Cloud yang berbeda, Anda harus terlebih dahulu berbagi vSwitch.
        #bind_vpcs {
        #vpc_id = "vpc-j6cy0l32yz9ttxfy6****"
        #vswitch_id = "vsw-j6cv7rd1nz8x13ram****"
        #region_id = "cn-shanghai"
        #vpc_owner_id = "119285303511****"
        #}
        #bind_vpcs {
        #vpc_id = "vpc-j6cy0l32yz9ttd7g3****"
        #vswitch_id = "vsw-3h4yrd1nz8x13ram****"
        #region_id = "cn-shanghai"
        #vpc_owner_id = "119285303511****"
        #}
      }
      # Simpan sertifikat CA instans KMS ke file lokal.
       resource "local_file" "ca_certificate_chain_pem" {
       content  = alicloud_kms_instance.default.ca_certificate_chain_pem
       filename = "ca.pem"
      }

      Buat kunci di instans KMS:

      # Kunci ini memiliki spesifikasi Aliyun_AES_256 dan digunakan untuk enkripsi dan dekripsi (ENCRYPT/DECRYPT).
      resource "alicloud_kms_key" "kms_software_key_encrypt_decrypt" {
        description = "default_key_encrypt_decrypt description"
        # Penggunaan kunci. Default: ENCRYPT/DECRYPT. Nilai valid: ENCRYPT/DECRYPT, yang menunjukkan bahwa kunci digunakan untuk mengenkripsi atau mendekripsi data.
        key_usage = "ENCRYPT/DECRYPT"
        # Spesifikasi kunci. Default: Aliyun_AES_256.
        key_spec = "Aliyun_AES_256"
        # ID instans KMS.
        dkms_instance_id       = alicloud_kms_instance.default.id
        pending_window_in_days = 7
        # Opsional: Peta tag yang ditetapkan ke resource.
        # tags = {
          # "Environment" = "Production"
          # "Name"        = "KMS-01"
          # "SupportTeam" = "PlatformEngineering"
          # "Contact"     = "ali***@test.com"
        # }
      }
      # Alias kunci adalah alias/kms_software_key_encrypt_decrypt, yang harus unik dalam Akun Alibaba Cloud.
      resource "alicloud_kms_alias" "kms_software_key_encrypt_decrypt_alias" {
        # Alias.
        alias_name = "alias/kms_software_key_encrypt_decrypt"
        # ID kunci.
        key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id
      }
    2. Tambahkan konten berikut ke main.tf untuk membuat secret.

      1. Secret generik

        # Buat secret generik bernama kms_secret_general1 dengan nilai secret_data_kms_secret_general1.
        resource "alicloud_kms_secret" "kms_secret_general" {
          # Nama.
          secret_name = "kms_secret_general1"
          # Deskripsi.
          description = "secret_data_kms_secret_general"
          # Tipe.
          secret_type = "Generic"
          # Menentukan apakah secret akan langsung dihapus. Default: false. Nilai valid: true, false.
          force_delete_without_recovery = true
          # ID instans KMS.
          dkms_instance_id = alicloud_kms_instance.default.id
          # ID kunci KMS.
          encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id
          # ID versi.
          version_id = "v1"
          # Tipe nilai. Default: text. Nilai valid: text, binary.
          secret_data_type = "text"
          # Data.
          secret_data = "secret_data_kms_secret_general1"
        }
      2. Kredensial RAM

        # Contoh pembuatan secret RAM.
        # Sebelum memulai, buat RAM user dan AccessKey yang ingin Anda buat sebagai secret RAM terkelola.
        # Proses ini terdiri dari dua langkah.
        
        # Langkah 1: Berikan izin kepada KMS untuk mengelola AccessKey RAM user.
        # 1.1 Buat kebijakan kustom bernama AliyunKMSManagedRAMCrendentialsRolePolicy.
        resource "alicloud_ram_policy" "AliyunKMSManagedRAMCrendentialsRolePolicy" {
          policy_name     = "AliyunKMSManagedRAMCrendentialsRolePolicy"
          policy_document = <<EOF
          {
              "Version": "1",
              "Statement": [
                  {
                      "Effect": "Allow",
                      "Action": [
                          "ram:ListAccessKeys",
                          "ram:CreateAccessKey",
                          "ram:DeleteAccessKey",
                          "ram:UpdateAccessKey"
                      ],
                      "Resource": "*"
                  }
              ]
          }
          EOF
          description     = "AliyunKMSManagedRAMCrendentialsRolePolicy"
          force           = true
        }
        
        # 1.2 Buat peran RAM bernama AliyunKMSManagedRAMCrendentialsRole.
        resource "alicloud_ram_role" "AliyunKMSManagedRAMCrendentialsRole" {
          name        = "AliyunKMSManagedRAMCrendentialsRole"
          description = "AliyunKMSManagedRAMCrendentialsRole"
          document    = <<EOF
          {
            "Statement": [
              {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Principal": {
                  "Service": [
                    "kms.aliyuncs.com"
                  ]
                }
              }
            ],
            "Version": "1"
          }
          EOF
          force       = true
        }
        
        # 1.3 Sambungkan kebijakan AliyunKMSManagedRAMCrendentialsRolePolicy ke peran AliyunKMSManagedRAMCrendentialsRole.
        resource "alicloud_ram_role_policy_attachment" "attach" {
          policy_name = alicloud_ram_policy.AliyunKMSManagedRAMCrendentialsRolePolicy.policy_name
          policy_type = alicloud_ram_policy.AliyunKMSManagedRAMCrendentialsRolePolicy.type
          role_name   = alicloud_ram_role.AliyunKMSManagedRAMCrendentialsRole.name
        }
        
        # Langkah 2: Buat secret RAM.
        resource "alicloud_kms_secret" "kms_secret_RAMCredentials" {
          # Nama secret.
          secret_name = "my_secret"
          # Deskripsi.
          description = "secret_kms_secret_RAMCredentials"
          # Tipe secret.
          secret_type = "RAMCredentials"
          # ID instans KMS.
          dkms_instance_id = alicloud_kms_instance.default.id
          # ID kunci yang digunakan untuk mengenkripsi nilai secret.
          encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id
          # Menentukan apakah secret akan langsung dihapus. Default: false. Nilai valid: true, false.
          force_delete_without_recovery = true
          # Menentukan apakah rotasi otomatis diaktifkan. Default: false. Nilai valid: true, false.
          enable_automatic_rotation = true
          # Interval rotasi otomatis.
          rotation_interval = "7d"
          # Konfigurasi tambahan. Ganti nilai UserName dengan username Anda.
          extended_config = "{\"SecretSubType\":\"RamUserAccessKey\", \"UserName\":\"testuser\"}" 
          # Versi.
          version_id = "V1"
          # Tipe nilai secret. Default: text. Nilai valid: text, binary.
          secret_data_type ="text"
          # Data.
          secret_data = "{\"AccessKeys\":[{\"AccessKeyId\":\"LTAI****************\",\"AccessKeySecret\":\"yourAccessKeySecret\"}]}"
        }
      3. Rahasia RDS

        Contoh ini menunjukkan cara membuat secret RDS dalam mode hosting akun ganda.

        variable "region" {
          default = "cn-hangzhou"
        }
        
        provider "alicloud" {
          region = var.region
        }
        
        variable "zone_id" {
          default = "cn-hangzhou-b"
        }
        
        variable "instance_type" {
          default = "pg.n2.2c.2m"
        }
        
        # Buat VPC.
        resource "alicloud_vpc" "main" {
          vpc_name   = "alicloud"
          cidr_block = "172.16.0.0/16"
        }
        
        # Buat vSwitch.
        resource "alicloud_vswitch" "main" {
          vpc_id     = alicloud_vpc.main.id
          cidr_block = "172.16.192.0/20"
          zone_id    = var.zone_id
          depends_on = [alicloud_vpc.main]
        }
        
        # Buat instans ApsaraDB RDS for PostgreSQL.
        resource "alicloud_db_instance" "instance" {
          engine               = "PostgreSQL"
          engine_version       = "13.0"
          instance_type        = var.instance_type
          instance_storage     = "30"
          instance_charge_type = "Postpaid"
          vswitch_id           = alicloud_vswitch.main.id
         
        }
        # Buat secret RDS.
        resource "alicloud_kms_secret" "kms_secret_RDS_MYSQL" {
          # Nama secret.
          secret_name = "rds_secret/${alicloud_db_instance.id}"
          # Tipe.
          secret_type = "Rds"
          # ID instans KMS.
          dkms_instance_id = alicloud_kms_instance.default.id
          # ID kunci yang digunakan untuk mengenkripsi nilai secret.
          encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id
          # Menentukan apakah rotasi otomatis diaktifkan. Default: false. Nilai valid: true, false.
          enable_automatic_rotation = true
          # Interval rotasi otomatis.
          rotation_interval = "7d"
          # Menentukan apakah secret akan langsung dihapus. Default: false. Nilai valid: true, false.
          force_delete_without_recovery = true
          # Konfigurasi.
          extended_config = "{\"SecretSubType\":\"DoubleUsers\", \"DBInstanceId\":\"rm-7xv1450tq4pj4****\" ,\"CustomData\": {}}"
          # Versi.
          version_id = "V1"
          # Tipe nilai secret. Default: text. Nilai valid: text, binary.
          secret_data_type = "text"
          # Data.
          secret_data = "{\"Accounts\":[{\"AccountName\":\"rdsuser1\",\"AccountPassword\":\"Admin****\"},{\"AccountName\":\"rdsuser2\",\"AccountPassword\":\"Admin****\"}]}"
        }
  2. Jalankan perintah berikut untuk menginisialisasi lingkungan Terraform.

    terraform init
    Terraform has created a lock file .terraform.lock.hcl to record the provider
    selections it made above. Include this file in your version control repository
    so that Terraform can guarantee to make the same selections by default when
    you run "terraform init" in the future.
    
    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
  3. Buat rencana eksekusi dan pratinjau perubahan.

    terraform plan
  4. Jalankan perintah berikut untuk membuat secret generik.

    terraform apply

    Pada prompt, masukkan yes dan tekan Enter. Tunggu hingga perintah selesai. Jika output berikut dikembalikan, secret generik berhasil dibuat.

    Do you want to perform these actions?
      Terraform will perform the actions described above.
      Only 'yes' will be accepted to approve.
    
      Enter a value: yes
    
    ...
    alicloud_kms_key.kms_software_key_encrypt_decrypt: Creation complete after 0s [id=key-shh6715c21812y8i7z***]
    alicloud_kms_alias.kms_software_key_encrypt_decrypt_alias: Creating...
    alicloud_kms_secret.kms_secret_general: Creating...
    alicloud_kms_alias.kms_software_key_encrypt_decrypt_alias: Creation complete after 0s [id=alias/kms_secret]
    alicloud_kms_secret.kms_secret_general: Creation complete after 1s [id=kms_secret_general1]
    ...
    
    Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
  5. Hasil verifikasi

    Jalankan perintah terraform show

    Jalankan perintah berikut untuk mengkueri detail resource yang Anda buat menggunakan Terraform:

    terraform show

    image

    Login ke Konsol Key Management Service

    Login ke Konsol Key Management Service untuk melihat secret yang Anda buat.

Bersihkan resource

Jika Anda tidak lagi memerlukan resource yang dibuat atau dikelola oleh Terraform, jalankan perintah berikut untuk melepaskannya. Untuk informasi selengkapnya tentang perintah terraform destroy, lihat Perintah umum.

terraform destroy

Contoh lengkap

Catatan

Kode contoh dalam topik ini mendukung eksekusi satu klik. Anda dapat menjalankan kode tersebut secara langsung. Jalankan kode

Kode contoh

variable "region" {
  default = "cn-heyuan"
}
provider "alicloud" {
  region = var.region
}
variable "instance_name" {
  default = "tf-kms-vpc-172-16"
}
# Buat VPC.
resource "alicloud_vpc" "vpc" {
  vpc_name   = var.instance_name
  cidr_block = "192.168.0.0/16"
}
# Buat vSwitch dengan blok CIDR 192.168.10.0/24.
resource "alicloud_vswitch" "vsw" {
  vpc_id     = alicloud_vpc.vpc.id
  cidr_block = "192.168.10.0/24"
  zone_id    = "cn-heyuan-a"
  vswitch_name = "terraform-example-1"
}
# Buat vSwitch lain dengan blok CIDR 192.168.20.0/24.
resource "alicloud_vswitch" "vsw1" {
  vpc_id     = alicloud_vpc.vpc.id
  cidr_block = "192.168.20.0/24"
  zone_id    = "cn-heyuan-b"
  vswitch_name = "terraform-example-2"
}
# Buat instans manajemen kunci perangkat lunak dan mulai dengan parameter jaringan.
resource "alicloud_kms_instance" "default" {
  # Instans manajemen kunci perangkat lunak.
  product_version = "3"
  vpc_id          = alicloud_vpc.vpc.id
  # Tentukan zona untuk instans KMS. Gunakan ID zona yang diperoleh sebelumnya.
  zone_ids = [
    "cn-heyuan-a",
    "cn-heyuan-b",
  ]
  # ID vSwitch.
  vswitch_ids = [
    alicloud_vswitch.vsw.id,alicloud_vswitch.vsw1.id
  ]
  # Performa komputasi, jumlah kunci, jumlah secret, dan jumlah operasi manajemen akses.
  vpc_num    = "1"
  key_num    = "1000"
  secret_num = "100"
  spec       = "1000"
}
# Simpan sertifikat CA instans KMS ke file lokal.
 resource "local_file" "ca_certificate_chain_pem" {
 content  = alicloud_kms_instance.default.ca_certificate_chain_pem
 filename = "ca.pem"
}
# Kunci ini memiliki spesifikasi Aliyun_AES_256 dan digunakan untuk enkripsi dan dekripsi (ENCRYPT/DECRYPT).
resource "alicloud_kms_key" "kms_software_key_encrypt_decrypt" {
  timeouts {
    delete = "30m" # Tambahkan periode timeout untuk penghapusan.
  }
  description = "default_key_encrypt_decrypt description"
  # Penggunaan kunci. Default: ENCRYPT/DECRYPT. Nilai valid: ENCRYPT/DECRYPT, yang menunjukkan bahwa kunci digunakan untuk mengenkripsi atau mendekripsi data.
  key_usage = "ENCRYPT/DECRYPT"
  # Spesifikasi kunci. Default: Aliyun_AES_256.
  key_spec = "Aliyun_AES_256"
  # ID instans KMS.
  dkms_instance_id       = alicloud_kms_instance.default.id
  pending_window_in_days = 7
}
# Alias kunci adalah alias/kms_software_key_encrypt_decrypt, yang harus unik dalam Akun Alibaba Cloud.
resource "alicloud_kms_alias" "kms_software_key_encrypt_decrypt_alias" {
  # Alias.
  alias_name = "alias/kms_software_key_encrypt_decrypt"
  # ID kunci.
  key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id
}
# Buat secret generik bernama kms_secret_general1 dengan nilai secret_data_kms_secret_general1.
resource "alicloud_kms_secret" "kms_secret_general" {
  # Nama.
  secret_name = "kms_secret_general1"
  # Deskripsi.
  description = "secret_data_kms_secret_general"
  # Tipe.
  secret_type = "Generic"
  # Menentukan apakah secret akan langsung dihapus. Default: false. Nilai valid: true, false.
  force_delete_without_recovery = true
  # ID instans KMS.
  dkms_instance_id = alicloud_kms_instance.default.id
  # ID kunci KMS.
  encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id
  # ID versi.
  version_id = "v1"
  # Tipe nilai. Default: text. Nilai valid: text, binary.
  secret_data_type = "text"
  # Data.
  secret_data = "secret_data_kms_secret_general1"
}