Предотвращение уничтожения ресурсов при рефакторинге Terraform для использования индексов - PullRequest
3 голосов
/ 01 июня 2019

Когда я только начинал использовать 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. Я проверил это со старой группой журналов и увидел, что все мои журналы были стерты (очевидно, поскольку журнал был уничтожен).

Имена и другие атрибуты групп / потоков журналов идентичны - я просто реорганизую код инфраструктуры, чтобы сделать его более понятным. Как я могу сохранить существующие группы журналов, не удаляя их, и все же реорганизовать мой код для использования списков?

1 Ответ

1 голос
/ 02 июня 2019

Вам необходимо переместить существующие ресурсы в состояние Terraform.

Попробуйте запустить terraform show, чтобы получить строки, под которыми хранятся ресурсы, это будет что-то вроде [module.xyz.]aws_cloudwatch_log_group.image1_log ...

Вы можете переместить его с помощью terraform state mv [module.xyz.]aws_cloudwatch_log_group.image1_log '[module.xyz.]aws_cloudwatch_log_group.service-log-groups[0]'. Вы можете выбрать, какой индекс назначить для каждого ресурса, изменив [0] соответственно.

Удалите старое определение ресурса для каждого перемещенного ресурса, так как иначе Terraform попытается создать новую группу / поток.

Попробуйте выполнить первый импорт и проверьте с помощью terraform plan, правильно ли был перемещен ресурс ...

Также убедитесь, что вам нужно выбрать какой-то индекс для списка image_names, но я думаю, что в этом нет необходимости.

...