Как отобразить метрики AWS в Slack с помощью простой команды Slack

Требования:

  • Доступ к консоли AWS
  • Пользователь AWS IAM с доступом для чтения Cloudwatch
  • Пользователь AWS IAM с возможностью чтения/записи в S3, Lambda, API Gateway
  • Административный доступ к рабочей области Slack

Основные шаги:

  • Создайте Lambda, чтобы получать изображения метрик из Cloudwatch, используя серверную часть Flask для обработки запросов Slack POST.
  • Разверните Lambda с помощью Zappa для автоматического создания Lambda и шлюза API
  • Подключить шлюз API к команде косой черты Slack

Фон

Моя работа в качестве службы технической поддержки включает в себя гораздо больше времени, чем я мог бы подумать, глядя на графики AWS Cloudwatch. Как известно любому, кто работал с AWS, постоянно открывать консоль AWS может быть неудобно, особенно если вы просто хотите проверить что-то простое, например, текущее количество экземпляров в сети. Чем больше я заходил в AWS, тем больше я думал о том, что должен быть лучший метод для получения простой информации от AWS, особенно о возможности автоматического обмена обновленными данными с другими, у которых может не быть доступа к AWS.

Вот пример конечного продукта

(Полный код находится на https://github.com/JulianRunnels/Slackbot, пожалуйста, не стесняйтесь предлагать какие-либо улучшения, так как я кодер-самоучка, и этот код может быть не самым надежным)

Создание AWS Slackbot

Получение данных из AWS

Я провел базовое исследование, которое в конечном итоге привело меня к интерфейсу командной строки AWS и, более того, к boto3, специфичному для Python SDK для подключения к AWS. Благодаря этому я мог запросить AWS и получить конкретную информацию, используя get_metric_widget_image:

Чтобы отобразить метрику на графике, перейдите в сервис Cloudwatch в консоли AWS, перейдите в раздел «Метрики», выберите показатель, который хотите отобразить на графике, а затем перейдите в «Источник» и выберите представление в качестве API изображения. Скопируйте этот json в свой скрипт в качестве метрики, из которой будут извлекаться данные.

Пример: показатель использования ЦП группы автомасштабирования:

cpu_metric = '{"Показатели":[["AWS/EC2","CPUUtilization","AutoScalingGroupName",' \

«NAME_OF_AUTOSCALING_GROUP_HERE»]]», «просмотр»: «timeSeries», «с накоплением»: false,’ \

«период»: 300», «yAxis»: {«left»: {«min»: 0}}», «title»: «Автомасштабирование использования ЦП», «start»: «-PT1H», «\

«конец»: «P0D», «часовой пояс»: «-0800}»

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

Теперь, когда у меня появилась возможность извлекать информацию из AWS, мне нужен был простой способ настроить способ автоматического просмотра этой информации другими членами команды без необходимости извлекать ее мне. Итак, я посмотрел на программу, которую мы уже активно используем, Slack.

Слабость

Базовая структура команды Slack slash заключается в том, что Slack отправляет запрос POST с различной информацией на указанный URL-адрес, и ее легко настроить и понять. После развертывания лямбды просто возьмите URL-адрес api_gateway, который он вам дает, и поместите его в URL-адрес ответа для созданной вами команды с косой чертой (подробнее об этом позже). Для локального тестирования я использовал Flask-ngrok для создания локального прокси-сервера и запускал через него команды.

Flask/Slackclient

Эта фактическая обработка запроса POST от Slack выполняется простым бэкэндом Flask. По сути, если он получает действительный ответ, он сообщает пользователю, что он его получил, а затем передает запрос обработчику для получения соответствующей информации. Эта информация передается обратно в slack-канал через Slackclient — комплект разработчика Python для Slack. Как только информация о метрике передается через Boto3, она передается обратно на канал, по которому был сделан запрос, и там отображается изображение. Большинство ответов Flask выполняются одновременно с помощью задач Flask, что делает весь процесс довольно быстрым. Он также имеет некоторую обработку ошибок для ответов, которые он не знает. И, как я упомяну позже, есть проверка запроса от Slack, чтобы убедиться, что он из нужного места.

Заппа

И для развертывания этой лямбды я использовал Zappa для развертывания. Zappa потребовалось некоторое время, чтобы выяснить это, и для некоторых людей это может стать предметом разногласий, поскольку для этого требуется пользователь IAM с правами развертывания и выполнения для Lambda, API Gateway и S3 как минимум. Фактическое развертывание Zappa очень просто, обратитесь к документации. Я включил свой zappa_settings.json с отредактированной личной информацией. Просто установите Zappa и запустите zappa init в командной строке, и она автоматически создаст zappa_settings, которые вы сможете настроить с помощью таких элементов, как keep_warm.

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

Безопасность

Конечно, важным моментом, который следует учитывать, является безопасность. На какой бы машине Zappa ни развертывалась, ей потребуется доступ к набору учетных данных AWS для пользователя IAM с правом чтения/записи в часть вашей среды. Это представляет некоторый риск, но его можно уменьшить, поместив сценарий развертывания Zappa на заблокированный компьютер развертывания, с ключами, сохраненными в частном порядке на этом компьютере, или создав Lambda самостоятельно.

Slack Connection использует уникальный токен Slack Bot для публикации в приложении вашей команды и проверяет как токен подтверждения, так и Slack Team Id в каждом запросе, чтобы убедиться, что это действительный запрос. Также есть возможность настроить структуру oauth для дополнительной безопасности. Как видно из кода, большинство моих токенов безопасности передавались через переменные окружения. Будущее обновление, которое я запланировал, — перенести ключи во что-то вроде AWS Secret Manager, поскольку мой Slackbot уже существует как Lambda.

Будущие обновления

Отсюда можно создать множество потенциальных точек зрения, от таких вещей, как подключение к базе данных RDS для прямых запросов, до автоматических отчетов по электронной почте, созданных по простому запросу Slack. Однако чем больше вы подключаете что-то вроде AWS к внешнему источнику, такому как Slack, тем больше возможностей для атаки вы оставляете, поэтому важно осознавать это.

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

Пример: /info запрос «ПАРОЛЬ» Запрос

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

Использование

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

(Полный код находится на https://github.com/JulianRunnels/Slackbot, пожалуйста, не стесняйтесь предлагать какие-либо улучшения, так как я кодер-самоучка, и этот код может быть не самым надежным)