Este tópico descreve como atualizar a configuração do Terraform após migrar um recurso em um ambiente Terraform.
Por que atualizar a configuração do Terraform
Após a migração, os atributos do recurso mudam das seguintes formas:
A migração de uma Customer Master Key (CMK) ou de um segredo de uma instância compartilhada do Key Management Service (KMS) 1.0 para uma instância do KMS 3.0 associa o recurso à nova instância. Isso adiciona um atributo de ID da instância KMS ao recurso.
Se você migrar uma chave com nível de proteção HSM para uma instância de gerenciamento de chaves via software, o nível de proteção dela mudará para
SOFTWARE.
Quando o Terraform detecta que os arquivos de configuração não correspondem ao estado real da infraestrutura, ele cria um plano de execução para alinhá-los. Essa discrepância pode fazer com que o Terraform destrua a CMK ou o segredo migrado e crie um novo. Para evitar isso, atualize a configuração do Terraform após concluir a migração.
Soluções de atualização do Terraform
O KMS oferece duas soluções para atualizar a configuração do Terraform. Escolha a mais adequada ao seu caso de uso.
|
Critério |
Solução 1: Adicionar ignore_changes (recomendado) |
Solução 2: Adicionar dkms_instance_id |
|
Funcionamento |
Adicione o argumento |
Declare explicitamente o |
|
Lida com alteração de |
Sim |
Sim |
|
Lida com alteração de |
Sim |
Não |
|
Modificação de código |
Evita alterações no código de lógica de negócios. |
Exige alterações no código de lógica de negócios. |
|
Compatibilidade de versão |
Funciona com o provider do Terraform nas versões 1.235.0 e anteriores. Nota
Nas versões 1.235.0 e posteriores do Terraform, não é mais necessário ignorar o |
Compatível com todas as versões do provider. |
|
Casos de uso |
|
|
Solução 1: Adicionar ignore_changes
Para o recurso alicloud_kms_key, execute as etapas a seguir:
Adicione a instrução
ignore_changes = [dkms_instance_id,automatic_rotation,rotation_interval,protection_level].Se a rotação de chaves estava desativada antes da migração, ative-a após concluir o processo. Para obter mais informações, consulte key rotation.
Defina uma política de chave padrão. Para criar uma política personalizada, consulte Key policy overview.
O exemplo a seguir ativa a rotação de chaves com intervalo de 90 dias e define uma política de chave padrão. Ajuste a configuração conforme seus requisitos de negócios. Para obter detalhes sobre cada parâmetro, consulte alicloud_kms_key.
resource "alicloud_kms_key" "default_key_encrypt_decrypt" {
# add this
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
# end of add
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"
}
}
Para o recurso alicloud_kms_secret, execute as etapas a seguir:
Adicione a instrução
ignore_changes = [dkms_instance_id].Caso a rotação de segredos estivesse desativada antes da migração, ative-a após concluir o processo.
Defina uma política de segredo padrão. Para criar uma política personalizada, consulte Secret policy overview.
No exemplo a seguir, a rotação de segredos está desativada e uma política de segredo padrão está definida. Ajuste a configuração conforme seus requisitos de negócios. Para obter detalhes sobre cada parâmetro, consulte 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 add
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"
}
Solução 2: Adicionar dkms_instance_id
Este exemplo mostra como atualizar a configuração após migrar a CMK fecbd43a-*****-9c051c8cc26d para a instância KMS kst-hkk66e****boq8qsxxgxd.
-
No arquivo
main.tfdo diretório raiz, adicione o código a seguir.Em
locals, adicionedkms_instance_id = var.use_existing_key == true || alicloud_kms_key.kms.0.dkms_instance_id != "" ? alicloud_kms_key.kms.0.dkms_instance_id : null.Em
"alicloud_kms_key", adicionedkms_instance_id = var.dkms_instance_id.Em
"alicloud_kms_secret", adicionedkms_instance_id = var.dkms_instance_id.
Exemplo:
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 # 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 } -
No arquivo
variable.tfdo diretório raiz, defina a variáveldkms_instance_id.ImportanteO valor de
defaultdeve ser""ounull.# module default variable variable "dkms_instance_id" { description = "The ID of the KMS instance." type = string default = "" }# variables.tf variable "create_kms" { } variable "use_existing_key" { description = "Whether to create key. If false, you can speci..." type = bool default = false } variable "dkms_instance_id" { description = "The ID of the KMS instance." type = string default = "" } variable "policy" { description = " The content of the key policy. The value is i..." type = string default = "" } variable "automatic_rotation" { description = "Specifies whether to enable automatic key rota..." 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 # add this dkms_instance_id = var.dkms_instance_id # end of add } -
No módulo da chave, adicione o ID da instância, defina a política da chave e configure a rotação conforme seus requisitos.
Intervalo de rotação: O exemplo utiliza um intervalo de 90 dias. Modifique esse valor conforme necessário.
ID da instância KMS: Um exemplo é
kst-hkk66e****boq8qsxxgxd. Substitua o exemplo pelo seu ID real.Política de chave: O exemplo fornece uma política padrão. Para criar uma política personalizada, consulte Key policy overview.
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# In examples/complete/main.tf (module call) module "kms" { source = "../.." region = var.region profile = var.profile #key description = "Hello_KMS" pending_window_in_days = "7" status = "Enabled" automatic_rotation = "Enabled" rotation_interval = "90d" dkms_instance_id = "kst-hkk66exxx" policy = <<EOF { "Statement": [ { "Action": [ "kms:*" ] } ], "Version": "1" } EOF } # In main.tf (resource block) 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 # add this dkms_instance_id = var.dkms_instance_id lifecycle { # ... } } -
No módulo do segredo, adicione o ID da instância, defina a política do segredo e configure a rotação conforme seus requisitos.
Intervalo de rotação: A rotação não está ativada no exemplo. Modifique essa configuração conforme necessário.
ID da instância KMS: Um exemplo é
kst-hkk66e****boq8qsxxgxd. Substitua-o pelo ID real da sua instância.-
Política de segredo: O exemplo fornece uma política padrão. Para criar uma política personalizada, consulte Secret policy overview.
#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