Cette rubrique explique comment mettre à jour votre configuration Terraform après la migration d'une ressource dans un environnement Terraform.
Pourquoi mettre à jour la configuration Terraform
Après la migration, les attributs des ressources changent comme suit :
La migration d'une clé principale client (CMK) ou d'un secret depuis une instance partagée Key Management Service (KMS) 1,0 vers une instance KMS 3.0 associe la ressource à la nouvelle instance. Cela ajoute un attribut d'ID d'instance KMS à la ressource.
Si vous migrez une clé avec un niveau de protection HSM vers une instance de gestion de clés logicielle, son niveau de protection passe à
SOFTWARE.
Lorsque Terraform détecte que vos fichiers de configuration ne correspondent pas à l'état réel de votre infrastructure, il crée un plan d'exécution pour les aligner. Cette divergence peut amener Terraform à détruire la CMK ou le secret migré et à en créer un nouveau. Pour éviter cela, mettez à jour votre configuration Terraform une fois la migration terminée.
Solutions de mise à jour Terraform
KMS propose deux solutions pour mettre à jour votre configuration Terraform. Choisissez celle qui correspond le mieux à votre cas d'utilisation.
|
Critères |
Solution 1 : Ajouter ignore_changes (recommandée) |
Solution 2 : Ajouter dkms_instance_id |
|
Fonctionnement |
Ajoutez l'argument |
Déclarez explicitement le |
|
Gère la modification de |
Oui |
Oui |
|
Gère la modification de |
Oui |
Non |
|
Modification du code |
Évite les modifications du code de logique métier. |
Nécessite des modifications du code de logique métier. |
|
Compatibilité des versions |
Fonctionne avec les versions 1.235.0 et antérieures du fournisseur Terraform. Remarque
Pour les versions 1.235.0 et ultérieures de Terraform, vous n'avez plus besoin d'ignorer |
Fonctionne avec toutes les versions du fournisseur. |
|
Cas d'utilisation |
|
|
Solution 1 : Ajouter ignore_changes
Pour la ressource alicloud_kms_key, procédez comme suit :
Ajoutez l'instruction
ignore_changes = [dkms_instance_id,automatic_rotation,rotation_interval,protection_level].Si la rotation des clés était désactivée avant la migration, activez-la une fois la migration terminée. Pour plus d'informations, consultez Rotation des clés.
Définissez une stratégie de clé par défaut. Pour créer une stratégie personnalisée, consultez Présentation des stratégies de clé.
L'exemple suivant active la rotation des clés avec un intervalle de 90 jours et définit une stratégie de clé par défaut. Adaptez la configuration à vos besoins métier. Pour plus de détails sur chaque paramètre, consultez 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"
}
}
Pour la ressource alicloud_kms_secret, procédez comme suit :
Ajoutez l'instruction
ignore_changes = [dkms_instance_id].Si la rotation des secrets était désactivée avant la migration, activez-la une fois la migration terminée.
Définissez une stratégie de secret par défaut. Pour créer une stratégie personnalisée, consultez Présentation des stratégies de secret.
Dans l'exemple suivant, la rotation des secrets est désactivée et une stratégie de secret par défaut est définie. Adaptez la configuration à vos besoins métier. Pour plus de détails sur chaque paramètre, consultez 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"
}
Solution 2 : Ajouter dkms_instance_id
Cet exemple montre comment mettre à jour votre configuration après avoir migré la CMK fecbd43a-*****-9c051c8cc26d vers l'instance KMS kst-hkk66e****boq8qsxxgxd.
-
Dans le fichier
main.tfdu répertoire racine, ajoutez le code suivant.Dans
locals, ajoutezdkms_instance_id = var.use_existing_key == true || alicloud_kms_key.kms.0.dkms_instance_id != "" ? alicloud_kms_key.kms.0.dkms_instance_id : null.Dans
"alicloud_kms_key", ajoutezdkms_instance_id = var.dkms_instance_id.Dans
"alicloud_kms_secret", ajoutezdkms_instance_id = var.dkms_instance_id.
Exemple :
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 } -
Dans le fichier
variable.tfdu répertoire racine, définissez la variabledkms_instance_id.ImportantLa valeur de
defaultdoit être""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 } -
Dans le module de votre clé, ajoutez l'ID de l'instance, définissez la stratégie de clé et configurez la rotation des clés selon vos besoins.
Intervalle de rotation : l'exemple utilise un intervalle de 90 jours. Modifiez cette valeur si nécessaire.
ID de l'instance KMS : un exemple est
kst-hkk66e****boq8qsxxgxd. Remplacez l'exemple par votre ID réel.Stratégie de clé : l'exemple fournit une stratégie par défaut. Pour créer une stratégie personnalisée, consultez Présentation des stratégies de clé.
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 { # ... } } -
Dans le module de votre secret, ajoutez l'ID de l'instance, définissez la stratégie de secret et configurez la rotation selon vos besoins.
Intervalle de rotation : la rotation n'est pas activée dans l'exemple. Modifiez ce paramètre si nécessaire.
ID de l'instance KMS : un exemple est
kst-hkk66e****boq8qsxxgxd. Remplacez-le par l'ID réel de votre instance.-
Stratégie de secret : l'exemple fournit une stratégie par défaut. Pour créer une stratégie personnalisée, consultez Présentation des stratégies de secret.
#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