#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], который все еще присутствует в плане