Рубрики
Uncategorized

Автоматическая гигиена экземпляра с AWS SSM: Техническое обслуживание Окна

В прошлый раз мы смотрели на написание нашего собственного командного документа SSM с целью выполнения HealthChec … Теги от AWS, DEVOPS, Automation.

В прошлый раз мы смотрели на написание нашего собственного командного документа SSM с целью выполнения скрипта HealthCheck на наборе экземпляров EC2 на нескольких платформах.

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

TL; доктор

  • Мы можем использовать SSM-обслуживание Windows для автоматизации наших недавно созданных командных документов по расписанию
  • Несколько командных документов могут быть объединены в окне обслуживания, например мероприятие исправления, за которым следует HealthCheck
  • Это дает нам средство просмотра исторических вызовов на любой рабочий процесс Мы автоматизировали
  • Сохраняя выходы команды на S3, мы можем гарантировать, что мы можем восстановить журналы, которые слишком велики для отображения в консоли
  • Использование правил жизненного цикла S3, мы можем удалить в возрасте журналы

Еще раз весь код террафора для этого поста доступен на GitHub. Он разделен на две части:

  1. AWS-SSM-Automation-1-Barebones для босые входу
  2. AWS-SSM-Automation-1-регистрация для Улучшение регистрации

Введение в поддержание Windows

Техническое обслуживание Окна , являются средством выполнения некоторого рабочего процесса автоматизации в усадьбе AWS по расписанию. Получил документ SSM, который вы написали, и хотите, чтобы он автоматизировался? Как насчет Лямбда Вы хотите вызвать по обычным расписанию? Или, может быть, это Функция шага ? Независимо от случая использования, Windows для обслуживания для вас — просто не обманывайте имя — они не обязательно должны быть просто для поддержания!

Сходство к правилам EventBridge

«Но подожди» , Я слышу, как вы спросите , «Не добрасывайте правила CloudWatch/EventBridge, также позволяют вам вызывать события в расписании?»

Да они делают — оба обслуживания Windows и EventBridge Правила (более крупный брат облачных правил) Используйте Выражения Cron определить график, на котором они должны работать. Основная разница между ними в том, что окна обслуживания позволяют вам Укажите часовой пояс что выражение крина придерживается, тогда как EventBridge является привязан к UTC Отказ

Нет часового пояса, нет вечеринки

Поэтому, используя окна технического обслуживания, могут быть удобны, если вы находитесь в TimeZone без UTC, и вам не нужно постоянно преобразовывать свой локальный часовой пояс в UTC на расписание событий. Что еще более важно, Windows обслуживания уважает время на дневное время (DST), если ваш часовой пояс замечает его, чтобы вы могли быть уверены, что ваша автоматизация будет вызываться одновременно в указанном часовом поясе в течение всего года.

С другой стороны, правила EventBridge закреплены на UTC; Это означает, что если ваш часовой пояс замечает DST, вы обнаружите, что ваша автоматизация может быть выключена на час для некоторой части года (если вы не измените его, конечно — но кто хочет меняться автоматизации два раза в год ??).

Я не думаю, что я когда-либо встречал инженера программного обеспечения, который является фанатом DST!

Примечательно, что вы также можете просмотреть историю исполнения окон обслуживания Windows, так как они произошли в прошлом, позволяя вам быстро увидеть, был ли конкретный вызов успешным или нет — и свернуть в любые сбои.

Я не разбиваю правила EventBridge, на самом деле, легче настроить, чем окна обслуживания. Но всегда есть правильный инструмент для работы.

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

Автоматизация командных документов с окнами обслуживания

Итак, какова цель создания командного документа, который мы достигли в прошлый раз? Ну, мы не собираемся быть вручную, вызывающим его, как то, что мы делаем до сих пор — в качестве инженеров нам нужно автоматизировать как можно больше повторяющихся задач.

Для суммирования того, где мы сейчас находимся, мы создали командный документ, который при выполнении, автоматизирует следующее:

  1. Загрузки скрипта HealthCheck от S3
  2. Выполняет скрипт HealthCheck, не удавая призыв команды, если HealthCheck не проходит

HealthChecks важно постоянно работать как в нашей среде, как средство мониторинга и проверки поместья работает как предполагаемое, прежде чем ваши пользователи уведомляют. Им также необходимо запустить после того, как изменение было введено в среду, например, новое развертывание кода, или даже событие исправления через AWS-RunPatchbaseline документ.

Окно обслуживания Bowbones с AWS-RunPatchBaseline

Мы собираемся использовать Terraform снова, чтобы построить минимальное окно обслуживания. Вы можете просмотреть код для этого здесь Отказ Вы заметите хранилище, этот файл сидит идентичен одному из Первый пост За исключением того, что я включил новые ресурсы, которые позволят нам выполнить требование.

Вот поломка каждого из ресурсов, которые мы собираемся создавать.

Окно обслуживания

Это создает ресурс окна обслуживания, который затем упоминается в последующих ресурсах, которые мы создаем.

  • Это не больше, чем это выражение крина, которое я упоминал ранее, наряду с часовой поясом, он должен выполнить в
  • Мы указываем, как долго окно длится, и среза; оба из которых указаны в часах
    • Среза указывает на то, как задолжена до конца окна AWS не запланировать какие-либо новые задачи в этом окне
resource "aws_ssm_maintenance_window" "patch_with_healthcheck" {
  name              = "PatchWithHealthcheck"
  description       = "Daily patch event with a healthcheck afterward"
  schedule          = "cron(0 9 ? * * *)" # Everyday at 9am UK time
  schedule_timezone = "Europe/London"
  duration          = 3
  cutoff            = 1
}

Цель окна обслуживания

Нам нужно средство отказа от окна, какие экземпляры для цели и aws_ssm_maintevens_window_target Ресурс — это то, как вы это делаете. Ниже я демонстрирую два метода для этого:

  1. Укажите идентификаторы экземпляра напрямую
    • Удобный, если у вас есть фиксированный список экземпляров, которые вы хотите включить в окно обслуживания
  2. Целевые экземпляры их тегов
    • Это много для масштабируемого, и означает, что вам не нужно продолжать добавлять идентификаторы экземпляра в список
    • Когда окно обслуживания выполняется, он будет фильтровать экземпляры с помощью этого ключа TAG и Value Combo для того, что для цели

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

resource "aws_ssm_maintenance_window_target" "patch_with_healthcheck_target" {
  window_id     = aws_ssm_maintenance_window.patch_with_healthcheck.id
  name          = "PatchWithHealthcheckTargets"
  description   = "All instances that should be patched with a healthcheck after"
  resource_type = "INSTANCE"

  targets {
    key = "InstanceIds"
    values = concat(
      module.windows_ec2.id,
      module.linux_ec2.id
    )
  }

  # Using tags is more scalable
  #   targets {
  #     key    = "tag:Terraform"
  #     values = ["true"]
  #   }
}

Окно обслуживания Задачи

Задача исправления

Теперь для задач … Помните, что мы хотим выполнить наше документ SSM HealthCheck после исправления патча? Нам нужно построить задачу для выполнения AWS-RunPatchbaseline документ.

resource "aws_ssm_maintenance_window_task" "patch_task" {
  window_id        = aws_ssm_maintenance_window.patch_with_healthcheck.id
  task_type        = "RUN_COMMAND"
  task_arn         = "AWS-RunPatchBaseline"
  priority         = 10
  service_role_arn = aws_iam_role.patch_mw_role.arn

  max_concurrency = "100%"
  max_errors      = 0

  targets {
    key    = "WindowTargetIds"
    values = [aws_ssm_maintenance_window_target.patch_with_healthcheck_target.id]
  }

  task_invocation_parameters {
    run_command_parameters {
      timeout_seconds  = 3600

      parameter {
        name = "Operation"
        values = ["Scan"]
      }
    }
  }
}

Давайте пройдем через основные атрибуты:

  • window_id. — окно обслуживания, чтобы связать эту задачу с
  • task_type — Какую задачу это

    • Поскольку мы выполняем командный документ, значение здесь — КОМАНДА RUN
  • task_arn — Арн документа, который вы хотите бежать

    • Обратите внимание на имя документа также можно использовать здесь, как показано выше
  • Приоритет — Определяет, в каком порядке выполнятся задачи, в результате чего требуется чем ниже номер, чем ранее задача выполняется в окне

    • например Приоритет задачи 1 выполняется до одного с 10.
    • Задачи с одинаковым приоритетом выполняются параллельно
  • service_role_arn — говорит, какой роль IAM следует предположить, чтобы выполнить эту задачу как

    • Мы получим объяснение этого позже
  • max_concurrence — Указывает, сколько экземпляров эта задача должна быть вызвана одновременно

    • Это может принять процент в качестве значения, применив только к этому проценту целевых экземпляров одновременно
    • I.E. 50% Указывает только половину целевых экземпляров, выполнит задачу, выполненную за один раз
    • или это может принять фиксированное число, например 1 ; Указывает на то, что только один экземпляр должен иметь эту задачу, выполненную за раз
    • 100% Указывает, что эта задача будет вызываться на всех целях одновременно
  • Max_Errors — Указывает, сколько ошибок должно быть брошено, прежде чем мы прерваны дальнейшие вызовы

    • 0 Указывает, что любая ошибка будет прервать окно обслуживания и установить его результат к неудачному

Цели Блок позволяет нам определить, какие экземпляры нацеливаются на это — мы ссылаемся на aws_ssm_maintevens_window_target Ресурс, который мы создали ранее.

Наконец, task_invocation_Parameters. Позволяет настроить, как документ должен быть запущен через параметр настройка — которая передается в документ. Для этого примера мы выполняем только Сканировать Операция на документе, для целей тестирования.

Сканировать Будет ли только проверить пропущенные патчи — на самом деле не будет их установить.

Полный список доступных команд можно найти в AWS-RunPatchbaseline командный документ .

В консоли GUI мы можем увидеть доступные параметры для документа AWS-RunPatchBaseline

Задача HealthCheck

Далее мы хотим определить задачу HealthCheck.

resource "aws_ssm_maintenance_window_task" "healthcheck_task" {
  window_id        = aws_ssm_maintenance_window.patch_with_healthcheck.id
  task_type        = "RUN_COMMAND"
  task_arn         = aws_ssm_document.perform_healthcheck_s3.arn
  priority         = 20
  service_role_arn = aws_iam_role.patch_mw_role.arn

  max_concurrency = "100%"
  max_errors      = 0

  targets {
    key    = "WindowTargetIds"
    values = [aws_ssm_maintenance_window_target.patch_with_healthcheck_target.id]
  }

  task_invocation_parameters {
    run_command_parameters {
      timeout_seconds  = 600
    }
  }
}

Здесь не много разницы, по сравнению с задачей исправления; Наше сценарий HealthCheck не принимает нет параметры Таким образом, мы можем оставить их (хотя, если у вас есть, вам нужно добавить его здесь!) И task_arn Указывает на командный документ, который мы создали в прошлый раз.

Наверное, самые значительные изменения, хотя Приоритет Отказ Помните, что номер приоритета указывает за заказ задач, которые необходимо вызвать? Наша задача исправления имела приоритет 10 , в результате чего наша задача HealthCheck — 20 Отказ Это означает, что задача патча будет вызвана до HealthCheck One.

Я мог бы установить приоритет задач исправлений и Healthcheck на 1 и 2 соответственно для достижения того же.

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

Хотите пост-патч, задача до Healthcheck? Приложите новую задачу с приоритетом 15 Действительно

Роль IAM для окна обслуживания

Мы ссылались на aws_iam_role.patch_mw_role.arn Как наша задача service_role_arn Отказ Вы можете просмотреть код для него здесь — Но давайте пройдем их быстро.

Все, что мы делаем, — это создание роли IAM, позволяя услугам EC2 и SSM AWS предполагать указанную роль и применение предопределенной политики AWS Amazonssmmaintleanswindowrole к этой роли. Эта политика дает некоторые основные разрешения на роль, которая позволяет ему выполнять команды и многое другое в экземплярах.

data "aws_iam_policy_document" "patch_mw_role_assume" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type = "Service"

      identifiers = [
        "ec2.amazonaws.com",
        "ssm.amazonaws.com",
      ]
    }
  }
}

resource "aws_iam_role" "patch_mw_role" {
  name               = "PatchingMaintWindow"
  assume_role_policy = data.aws_iam_policy_document.patch_mw_role_assume.json
}

data "aws_iam_policy" "ssm_maintenance_window" {
  arn = "arn:aws:iam::aws:policy/service-role/AmazonSSMMaintenanceWindowRole"
}

resource "aws_iam_role_policy_attachment" "patch_mw_role_attach" {
  role       = aws_iam_role.patch_mw_role.name
  policy_arn = data.aws_iam_policy.ssm_maintenance_window.arn
}

Тестирование окна обслуживания Barebones

Как только мы побежали Террафом применяется На все вышеперечисленное мы можем проверить окно обслуживания. В настоящее время мы можем запустить время в 9:00 в Великобритании, которое может быть или не может быть долгое время — так что измените его вручную в консоль Время недалеко от вашего времени сейчас.

Как только это будет выполнить выполнение, вы можете перейти на вкладку «История» для просмотра выполнения.

Будем надеяться, что у вас будет больше удачи в ваших первых попытках, которые я сделал!

Вы можете выбрать любое выполнение и сверлить в него с помощью Подробнее кнопка.

Вы можете видеть, что задачи выполнены в порядке, мы определили их в

Мы можем пойти глубже в деталях исполнения и вытащить результат отдельных команд, выбрав Подробнее по вызову задачи.

Окно обслуживания перенаправлено на одну и ту же страницу, что и когда мы вручную вызвало команды документы в последнем посте

Нажав на один из идентификаторов экземпляра на приведенном выше скриншоте вышеупомянутых, приведет нас к выводу команды для этого экземпляра.

Регистрация командной записи на S3

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

Возьми AWS-RunPatchbaseline Выход на примере экземпляра Linux. Это довольно здоровее, и поэтому мы теряем много контекста на то, что на самом деле произошло:

Метод

Для борьбы с этим окна обслуживания позволяют вам выпустить вывод команды в ведро S3, чтобы вы могли получить его позже. В последнем посте мы создали ведро S3 для хранения наших сценариев SSM ( aws_s3_bucket.script_bucket.arn ), мы можем повторно использовать это ведро для хранения наших командных журналов.

Для того, чтобы сделать это, есть несколько шагов, которые нам нужно сделать:

  1. Политика ведра S3 необходимо разрешить роль экземпляра EC2 AWS_IAM_ROLE.VM_BASE к S3: PutObject на "$ {aws_s3_bucket.script_bucket.arn}/ssm_output/*"

    • SSM_OUTPUT/ это каталог/префикс в ведре S3, где мы будем хранить журналы
  2. Ключ KMS, используемый для шифрования объектов в целевом ведре S3, должен разрешить роль экземпляра AWS_IAM_ROLE.VM_BASE к кмс: Generatedatakey
  3. Роль экземпляра AWS_IAM_ROLE.VM_BASE нужны разрешения, чтобы сделать вышеизложенное на соответствующей стороне

Вы можете просмотреть изменения, необходимые в Гадость :

  1. S3 Bucket Policy.
  2. Ключевая политика KMS
  3. Роль экземпляра EC2

После того, как это сделано, нам нужно добавить некоторые новые атрибуты на задачи окна обслуживания, сообщив ей, где выбросить вывод команды на.

resource "aws_ssm_maintenance_window_task" "task_name" {

  # ... other attributes hidden

  task_invocation_parameters {
    run_command_parameters {
      output_s3_bucket     = aws_s3_bucket.script_bucket.id
      output_s3_key_prefix = "ssm_output/"

      # ... other attributes hidden
    }
  }
}

Когда у вас есть новый конфиг, написанный, то вы можете Террафом применяется и запустить еще один тест на окне обслуживания.

Теперь мы получим кнопку, которая может перенаправить нас туда, где хранятся журналы в S3

Если мы нажмем на эту кнопку, мы можем просмотреть журналы, хранящиеся в S3. Следуйте по пути в S3, пока не достигнете объекта S3, содержащего журналы.

Теперь вы можете открыть это, используя Действия объекта Кнопка в верхнем правом углу, чтобы просмотреть все журналы!

Проблемы лесозаготовок

Стоит отметить, что SSM не вызывает ошибку, если экземпляр не может продвигать журналы S3 — Amazon S3 Кнопка будет перенаправлять вас на объект в S3, который не существует. Поэтому, если ваши журналы не отображаются в S3, то убедитесь, что вы следите за шагами выше.

Пример, показывающий, если журналы не были успешно загружены на S3 — если вы получите это, пожалуйста, дважды проверьте, вы настроите все правильно!

Снятие старых командных журналов

Теперь, когда у нас есть обслуживание Windows, хранящие наши журналы в S3, мы должны убедиться, что мы поддерживаем хороший уровень гигиены, удалив старые журналы — в противном случае наше ведро S3 собирается хранить все больше и больше журналов, стоимостью нам больше денег.

S3 имеет функцию под названием Правила жизненного цикла который говорит S3, как обрабатывать объекты на протяжении их жизненного цикла. Мы можем сказать ей, чтобы переместить старые файлы на более дешевый класс хранения, архивировать их в S3 ледник (Долгосрочная служба хранения AWS), или просто просто удалите их!

Учитывая, что мы не совсем сентиментальные с журналами, мы можем определить политику, которая удалит любые журналы старше 3 месяцев (90 дней).

Для нас это очень легко добавить, нам просто нужно сделать дополнение ниже к нашему aws_s3_bucket ресурс.

resource "aws_s3_bucket" "script_bucket" {
  # ... other attributes hidden

  # Remove old SSM command output logs
  lifecycle_rule {
    id      = "RemoveOldSSMOutputLogs"
    enabled = true

    prefix = "ssm_output/"

    expiration {
      days = 90
    }
  }
}

Вы можете добавить больше правил, если хотите, например Переход Блок, чтобы переместить его в холодное хранилище, прежде чем удалять, если хотите. Посмотрите на Террафом документация Для ресурса например этого.

Журналы старше 90 дней, безусловно, не зажигают радость …!

Вывод

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

Вы также можете использовать документы SSM для извлечения файлов из экземпляров — такие как файлы журнала. Или даже используйте их для обновления стороннего программного обеспечения на экземплярах.

Следующий пост и после этого мы будем изучать сесть командных документов; Автоматизация документов и изучение того, как они могут дополнительно улучшить автоматизацию другим услугам AWS за пределы экземпляров EC2.

Оригинал: «https://dev.to/jdheyburn/automate-instance-hygiene-with-aws-ssm-maintenance-windows-5ck7»