Terraform - выдает ошибку при изменении отдельных компонентов AWS, где все еще присутствуют зависимые.

Я все еще новичок в Terraform. У меня есть сценарий, в котором предположим, что необходимо воссоздать только один компонент AWS, но он зависит от другого компонента, который не требует никаких изменений, например. Изменение компонента конфигурации запуска невозможно, если присутствует группа AutoScaling. Даже если ASG отмечен как испорченный, terraform выдает ошибку ""

  • aws_launch_configuration.sample-launch-configuration: произошла 1 ошибка (и):

  • aws_launch_configuration.sample-launch-configuration: Ошибка при создании конфигурации запуска: AlreadyExists: Конфигурация запуска с этим именем уже существует - конфигурация запуска уже существует с именем sample-lc, код состояния: 400, идентификатор запроса: 3dc2da6d-96e4-11e8-9086- cb6ff2d21a1c

    Как исправить такие зависимости, не разрушая весь кластер?

EDITED: добавление исходного кода. (Частичный пример кода)

 resource "aws_autoscaling_group" "sample-autoscaling-group" {
  name                 = "sample-asg"
  max_size             = "${var.max_instance_size}"
  min_size             = "${var.min_instance_size}"
  desired_capacity     = "${var.desired_capacity}"
  vpc_zone_identifier  = ["${var.private-subnets}"]
  launch_configuration = "${aws_launch_configuration.sample-launch-configuration.name}"
  health_check_type    = "EC2"

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_launch_configuration" "sample-launch-configuration" {
  name                 = "sample-lc"
  image_id             = "ami-706cca12"
  instance_type        = "t2.small"
  iam_instance_profile = "${aws_iam_instance_profile.ecs-ec2-service-profile.id}"

  lifecycle {
    create_before_destroy = true
  }

  security_groups             = ["${aws_security_group.test_public_sg.id}"]
  associate_public_ip_address = "true"
  key_name                    = "${var.ecs-key-pair-name}"

  user_data = "${file("./templates/user_data.sh")}"
}

Если я изменю, скажем, файл user_data.sh и попытаюсь выполнить это, он потерпит неудачу.


person Sorabh Mendiratta    schedule 03.08.2018    source источник
comment
Можете ли вы поделиться своим кодом Terraform?   -  person ydaetskcoR    schedule 03.08.2018
comment
Привет @ydaetskcoR, добавил пример кода. Невозможно поделиться фактическим, поскольку он принадлежит клиенту.   -  person Sorabh Mendiratta    schedule 05.08.2018


Ответы (2)


Перечитав сообщение и прилагаемую конфигурацию, я думаю, что пропустил реальную проблему. Я собираюсь оставить приведенное ниже объяснение, потому что оно может быть кому-то полезно в какой-то момент. Что касается вашей реальной проблемы, вы указываете create_before_destroy в конфигурации запуска, но она имеет статическое имя. Конфигурации запуска нельзя редактировать после создания, они должны быть уничтожены и созданы заново (https://www.terraform.io/docs/providers/aws/r/launch_configuration.html), поэтому TF пытается сначала создать новый, но не может, потому что он использует то же имя, что и тот, что уже есть.


Оригинальный ответ (где я полностью пропустил реальную проблему):

Похоже, вы пытаетесь создать обе конфигурацию запуска и группу автоматического масштабирования (поскольку вы определяете обе как resources). Если ASG уже существует и не управляется terraform, вы, вероятно, вместо этого захотите сослаться на ASG с data источником (см. Docs здесь). Если вы хотите, чтобы ASG управлялась с помощью указанной выше конфигурации terraform, но в настоящее время это не так, вы можете посмотреть на ее импорт (см. Документы здесь внизу). Если ASG управляется другим терраформом, вам нужно будет посмотреть на состояние совместного использования ваших конфигураций (см. Документы здесь).

person jstill    schedule 08.08.2018
comment
Спасибо @jstill, я попробую удалить жизненный цикл и попробую - person Sorabh Mendiratta; 10.08.2018
comment
@SorabhMendiratta Я думаю, что вы действительно можете захотеть покинуть жизненный цикл и перейти на использование name_prefix вместо name в конфигурации запуска (см. Документы конфигурации запуска terraform, которые я привел выше). - person jstill; 10.08.2018
comment
Да ты прав. Я сделал то же самое, и это сработало. Я вошел в систему, чтобы обновить то же, что и ответ. Вы можете добавить этот комментарий в качестве ответа, и я отмечу его соответствующим образом. - person Sorabh Mendiratta; 12.08.2018

Ответ на проблему выше - использовать атрибут name_prefix, как показано ниже. Это решило проблему. Большое спасибо @jstill за то, что вы постоянно возвращались с возможными вариантами.

    resource "aws_launch_configuration" "sample-launch-configuration" {
      name_prefix                 = "sample-lc"
      image_id                    = "ami-706cca12"

Согласно документации terraform, ниже приведен фрагмент

Использование с AutoScaling Groups Конфигурации запуска не могут быть обновлены после создания с помощью Amazon Web Service API. Чтобы обновить конфигурацию запуска, Terraform уничтожит существующий ресурс и создаст замену. Чтобы эффективно использовать ресурс конфигурации запуска с ресурсом AutoScaling Group, рекомендуется указать create_before_destroy в блоке жизненного цикла. Либо опустите атрибут имени конфигурации запуска, либо укажите частичное имя с префиксом name_prefix.

Документацию можно найти здесь

person Sorabh Mendiratta    schedule 13.08.2018