Проблемы синхронизации AWS SNS, Lambda и AutoScaling - PullRequest
0 голосов
/ 02 июля 2018

Я использую Terraform для развертываний AWS, и в настоящее время я пытаюсь связать функцию Lambda с масштабируемым поведением кластера ECS. Это работает в целом, но сроки вещей недопустимы. В моей последней попытке кластер растет в 13:11, 13:14, 13:17 и в 13:20, но функция Lambda запускается в 13:11, 13:36, 13:38 и 13:56. 1001 *

Я ищу решение, где лямбда-функция запускается (примерно) при масштабировании кластера, то есть порождает дополнительные экземпляры EC2).

Мой подход работает так:

  • Кластер ECS состоит из одного aws_autoscaling_group и одного ELB.
  • Для группы автоматического масштабирования я создал aws_autoscaling_policy с
    • adjustment_type = "ChangeInCapacity" и
    • scaling_adjustment = "5"
  • Для масштабирования этого кластера выделено aws_sns_topic
  • Я запускаю группу автоматического масштабирования и публикую в теме SNS в том же aws_cloudwatch_metric_alarm:

resource "aws_cloudwatch_metric_alarm" "ecs_grow" {
    [...]
    comparison_operator = "GreaterThanOrEqualToThreshold"
    namespace = "AWS/ECS"
    metric_name = "CPUUtilization"
    threshold = "16"
    statistic = "Average"
    period = "60"
    evaluation_periods  = "1"
    alarm_actions = [
        "${aws_autoscaling_policy.grow_policy.arn}",
        "${aws_sns_topic.scaling_topic.arn}"
    ]
}

Функция Lambda в настоящее время только записывает событие в журнал.

С этой настройкой я генерирую нагрузку на свой кластер, чтобы он масштабировался каждые 3 минуты. Я могу подтвердить, что это работает, посмотрев метрики Cloudwatch GroupDesiredCapacity GroupTotalInstances и, конечно, EC2 показывает, что консоль AWS показывает мне. Действительно, кластер растет каждые 3 минуты на 5 раз.

Я начал с 5 экземпляров и позволил кластеру масштабироваться 4 раза. Это означает, что в конце у меня был кластер с 25 экземплярами. В моих показателях Cloudwatch я вижу, как график GroupDesiredCapacity поднимается на 5 в 13:11, 13:14, 13:17 и в 13:20, как и ожидалось, и в соответствии с тем, что я вижу на консоли AWS.

Моя проблема в том, что лямбда-функция срабатывает только в конце концов. Я получаю записи в журнале в 13:11, 13:36, 13:38 и 13:56.

Что меня действительно смущает, так это то, что StateChangeTime, о которых сообщают аварийные сигналы, - это 13:11, 13:36, 13:38 и 13:56. Таким образом, может показаться, что функция Lambda действительно запускается, как только сообщения публикуются.

Откуда происходит это несоответствие между срабатыванием политики автомасштабирования и публикацией сообщений? Что еще более важно, как я выровняю два?

1 Ответ

0 голосов
/ 06 июля 2018

Я нашел обходной путь. Я использую автоматическое уведомление для отправки других / дополнительных уведомлений:

resource "aws_autoscaling_notification" "scaling_notifications" {
  group_names = [ "${aws_autoscaling_group.ecs.name}" ]
  notifications = [ "autoscaling:EC2_INSTANCE_LAUNCH" ]
  topic_arn = "${aws_sns_topic.scaling_topic.arn}"
}

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

...