Когда я только начинал использовать Terraform, я более или менее наивно объявлял ресурсы по отдельности, например:
resource "aws_cloudwatch_log_group" "image1_log" {
name = "${var.image1}-log-group"
tags = module.tagging.tags
}
resource "aws_cloudwatch_log_group" "image2_log" {
name = "${var.image2}-log-group"
tags = module.tagging.tags
}
resource "aws_cloudwatch_log_stream" "image1_stream" {
name = "${var.image1}-log-stream"
log_group_name = aws_cloudwatch_log_group.image1_log.name
}
resource "aws_cloudwatch_log_stream" "image2_stream" {
name = "${var.image2}-log-stream"
log_group_name = aws_cloudwatch_log_group.image2_log.name
}
Затем, через 10-20 различных групп журналов, я понял, что это не будет работать хорошо, так как инфраструктура росла. Я решил определить список переменных:
variable "image_names" {
type = list(string)
default = [
"image1",
"image2"
]
}
Затем я заменил ресурсы, используя индексы:
resource "aws_cloudwatch_log_group" "service-log-groups" {
name = "${element(var.image_names, count.index)}-log-group"
count = length(var.image_names)
tags = module.tagging.tags
}
resource "aws_cloudwatch_log_stream" "service-log-streams" {
name = "${element(var.image_names, count.index)}-log-stream"
log_group_name = aws_cloudwatch_log_group.service-log-groups[count.index].name
count = length(var.image_names)
}
Проблема в том, что когда я запускаю terraform apply
, я получаю 4 resources to add, 4 resources to destroy
. Я проверил это со старой группой журналов и увидел, что все мои журналы были стерты (очевидно, поскольку журнал был уничтожен).
Имена и другие атрибуты групп / потоков журналов идентичны - я просто реорганизую код инфраструктуры, чтобы сделать его более понятным. Как я могу сохранить существующие группы журналов, не удаляя их, и все же реорганизовать мой код для использования списков?