TF 1.0.10: при удалении count из модуля план хочет уничтожить, а затем воссоздать все

#terraform #terraform-provider-aws

#terraform #terraform-provider-aws

Вопрос:

Я запустил проект TF v0.14.8 и в то время, которое использовалось count для выбора модуля, вот так:

 module "moduleA" { 
  source                         = "./moduleA"
  count                          = var.aws_env == "moduleA" ? 1 : 0
  aws_env                        = var.aws_env
  aws_security_group_id          = var.aws_security_group_id
  aws_subnet_1                   = var.aws_subnet_1
}

module "moduleB" {
  source                         = "./moduleB"
  count                          = var.aws_env == "moduleB" ? 1 : 0
  aws_env                        = var.aws_env
  aws_security_group_id          = var.aws_security_group_id
  aws_subnet_1                   = var.aws_subnet_1
}
 

Когда я запустил terraform plan/apply бы, у меня было бы aws_env установлено значение moduleA или moduleB для выбора этого модуля.

С тех пор я успешно обновился v1.0.10 и надеюсь избавиться от count аргумента из-за его встроенных блокировок с поставщиками внутри модулей. Мой последний main.tf выглядит примерно так:

 terraform {
  required_version = ">= 1.0.10"
  backend "s3" {
  }
}

provider "aws" {
  region = "us-east-1"
}

module "moduleA" { 
  source                         = "./moduleA"  
  aws_env                        = var.aws_env
  aws_security_group_id          = var.aws_security_group_id
  aws_subnet_1                   = var.aws_subnet_1
}

module "moduleB" {
  source                         = "./moduleB"
  aws_env                        = var.aws_env
  aws_security_group_id          = var.aws_security_group_id
  aws_subnet_1                   = var.aws_subnet_1
}

variable "aws_env" {}
variable "aws_security_group_id" {}
variable "aws_subnet_1" {}
 

Концептуально это отлично работает, поскольку я планирую / применяю TF следующим образом ( {TF_ACTION} установлено значение plan или apply ):

terraform ${TF_ACTION} -target=module.${AWS_ENV} -input=false с {AWS_ENV} установленным значением moduleA или moduleB .

Проблема, с которой я сталкиваюсь, заключается в том, что после count удаления на TF plan — TF хочет уничтожить и воссоздать все 155 моих ресурсов AWS, включая ключи KMS, которые в настоящее время шифруют данные.

Как я могу избежать того, чтобы TF хотел уничтожить, а затем воссоздать все при удалении count ?

Комментарии:

1. Здесь есть несколько красных флажков, которые были и будут вызывать у вас проблемы, но чтобы ответить на ваш вопрос напрямую: на этом этапе вам, вероятно, потребуется выполнить глобальную замену в вашем файле состояния. Пожалуйста, поделитесь соответствующим фрагментом состояния ресурса, чтобы мы могли предоставить ответ.

2. Изложите суть — спасибо за вашу помощь. Не могли бы вы упомянуть проблемы, которые вы видите? Если мне придется что-то сломать сейчас, это было бы лучше, чем делать это через 2 года с большим количеством ресурсов, построенных lol

3. Я добавил следующее к ключу KMS, который на самом деле является единственным ресурсом, который мы заботимся о том, чтобы не уничтожать: resource "aws_kms_key" "moduleB_client_kms_key" { description = "ModuleB KMS key for ${var.client_code}" lifecycle { prevent_destroy = true }

4. Получение этой ошибки сейчас: Resource module.moduleB[0].module.moduleB_client_name.aws_kms_key.moduleb_client_kms_key has lifecycle.prevent_destroy set, but the plan calls for this resource to be destroyed. To avoid this error and continue with the plan, either disable lifecycle.prevent_destroy or reduce the scope of the plan using the -target flag. следовательно, count [0], который все еще присутствует в плане