Как сделать постепенное отключение AWS ASG с помощью terraform? - PullRequest
1 голос
/ 23 октября 2019

Проблема

На terraform destroy все ресурсы ASG прекращаются, и некоторые службы (spark streaming в моем случае) могут по-прежнему иметь данные для обработки.

Чтобы убедиться, что мое приложение корректно завершает работу, я подключаюсь к каждому экземпляру ASG для выполнения systemctl stop service, и я хотел бы автоматизировать этот процесс с помощью Terraform

Leads

Я знаю ключевое слово when="destroy и remote-exec инициатора, но я не уверен, каков рекомендуемый способ корректного завершения работы экземпляров в ASG.

resource "aws_instance" "app" {
  # ...

  provisioner "remote-exec" {
    when    = "destroy"
    inline = [ "systemctl stop service" ]
  }
}

source:

1 Ответ

1 голос
/ 23 октября 2019

Вы можете использовать автоматическое масштабирование групповых перехватчиков жизненного цикла , чтобы запретить ASG завершать экземпляр до того, как перехват будет помечен как завершенный.

Вы можете прикрепить перехватчик жизненного цикла завершения к вашей ASG, используяaws_autoscaling_lifecycle_hook resource :

resource "aws_autoscaling_group" "example" {
  availability_zones   = ["us-west-2a"]
  name                 = "example"
  min_size             = 1
  max_size             = 2
}

resource "aws_autoscaling_lifecycle_hook" "example" {
  name                   = "example"
  autoscaling_group_name = "${aws_autoscaling_group.example.name}"
  default_result         = "CONTINUE"
  heartbeat_timeout      = 300
  lifecycle_transition   = "autoscaling:EC2_INSTANCE_TERMINATING"

  notification_target_arn = "arn:aws:sqs:us-west-2:444455556666:queue1*"
  role_arn                = "arn:aws:iam::123456789012:role/S3Access"
}

Приведенный выше пример заставит ASG ждать 5 минут (300 секунд) после того, как экземпляр будет готов к завершению. Как только ловушка жизненного цикла запускается ASG, пытающейся завершить работу экземпляра, он отправляет уведомление на notification_target_arn, который может быть либо очередью SQS, либо темой SNS.

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

После завершения действия вам потребуется пометить хук жизненного цикла как завершенный, вызвав API-интерфейс AWS с соответствующей информацией. Или вы можете подождать тайм-аут и позволить ASG продолжить с завершением в соответствии с параметром default_result на ресурсе aws_authscaling_lifecycle_hook.

...