Получение информации о ресурсах, которые вы развернули в своей инфраструктуре Amazon Web Services (AWS), означает утомительную навигацию по Консоли управления AWS или использование интерфейса командной строки AWS.

Этот подход хорошо работает при настройке одной учетной записи. Тем не менее, лучшая практика, предложенная AWS, — настроить среду с несколькими учетными записями, чтобы разделить ваши рабочие нагрузки и пользователей. По мере роста количества учетных записей навигация по вашей инфраструктуре и поиск ресурсов через консоль или интерфейс командной строки становятся все более сложными.

Количество ресурсов в этих аккаунтах только растет. Разработчики создают ресурсы с помощью таких инструментов, как Terraform, CDK или CloudFormation… а иногда даже с помощью консоли или интерфейса командной строки.

Важны не только сами ресурсы, но и отношения между вашими ресурсами: например, том EBS подключается к экземпляру EC2, работающему в VPC, и доступен через балансировщик нагрузки ALB.

Итак, как вы можете увидеть все, что работает в вашем облаке, включая зависимости между вашими ресурсами?


Графический поиск

Мы создали Ресото чтобы позволить пользователю легко искать ресурсы и автоматизировать рабочие процессы. Resoto собирает данные о вашей инфраструктуре и строит направленный ациклический граф, где ресурсы — это вершины, а их взаимосвязи/зависимости — ребра.

Именно этот график делает Resoto таким мощным. Но нам также нужен был способ, позволяющий пользователям запрашивать эти данные.

Графические данные не являются реляционными, поэтому SQL не подходит. А существующие языки графовых запросов, такие как Cypher, Gremlin или GSQL, имеют крутые кривые обучения и излишне сложны для этого варианта использования.

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


Пример: поиск инстансов EC2

Давайте попробуем найти все доступные инстансы EC2. is() будет соответствовать определенному или абстрактному типу полиморфным образом, проверяя все типы и подтипы предоставленного типа.

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

search is(aws_ec2_instance) and instance_cores > 2

и вот (сокращенный) результат:

id=i-a..., name=crmsec, age=2y2M, account=dev, region=us-east-1
​id=i-0..., name=airgap, age=2M, account=staging, region=eu-central-1
​id=i-0..., name=flixer, age=1M3w, account=sales, region=us-west-2
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

search is(aws_ec2_instance) and instance_cores > 2 limit 1 | dump

В случае EC2 такими свойствами являются, например, количество ядер, памяти, фактический тип экземпляра и его статус:

reported:
​  kind: aws_ec2_instance
​  id: i-a...
​  tags:
​    aws:cloudformation:stack-name: lk-build-server
​    aws:cloudformation:stack-id: arn:aws:cloudformation:...
​    owner: team-proto
​  name: LKbuild
​  instance_cores: 4
​  instance_memory: 16
​  instance_type: t3.xlarge
​  instance_status: stopped
​  age: 1y10M
Войти в полноэкранный режим

Выйти из полноэкранного режима

Мы можем уточнить и сгруппировать результаты. Давайте сгруппируем наши экземпляры по instance_type с помощью команды подсчета:

search is(aws_ec2_instance) and instance_cores > 2 | count instance_type

t3.2xlarge: 1
​m5.4xlarge: 15
​total matched: 16
​total unmatched: 0
Войти в полноэкранный режим

Выйти из полноэкранного режима

Поиск возвращает шестнадцать экземпляров EC2, в том числе пятнадцать m5 и один t3 xlarge.


Использование поиска по графу для понимания зависимостей

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

Когда Resoto собирает данные о вашей облачной инфраструктуре, она создает границу между экземплярами ELB и EC2, если ELB уравновешивает трафик соответствующего экземпляра EC2. На изображении ниже вы можете увидеть, как график отображает весь набор зависимостей в учетной записи:

Описание изображения

search is(aws_ec2_instance) and instance_cores > 2 --> is(aws_elb)

name=a5..., age=1y1M, account=sales, region=eu-central-1
​name=a3..., age=6M2w, account=staging, region=us-west-2
Войти в полноэкранный режим

Выйти из полноэкранного режима

-->arrow возьмет все подходящие инстансы EC2 и пройдёт по графу «исходящий», сдвинувшись ровно на один шаг. Список подходящих элементов не ограничивается только балансировщиками нагрузки ELB, поэтому с is(aws_elb) мы снова фильтруем список, чтобы возвращать только результаты ELB.

Также можно отменить последний запрос, чтобы вывести все экземпляры EC2 за ELB:

search is(aws_elb) <-- is(aws_ec2_instance) and instance_cores > 2

id=i-0..., name=airgap, age=2M, account=staging, region=eu-central-1
​id=i-0..., name=flixer, age=1M3w, account=sales, region=us-west-2
Войти в полноэкранный режим

Выйти из полноэкранного режима

Стрелка теперь зеркально отражена и пересекает граф «входящий», проходя по ребрам в противоположном направлении.


Сценарии использования

Поиск на основе графа становится полезным, когда вы пытаетесь решить проблемы, требующие понимания того, как ресурсы связаны друг с другом.

Примером может служить «радиус взрыва» ресурса.

Когда вы планируете очистить инстанс EC2, какие еще ресурсы вы также отключаете? Или, наоборот, какие ресурсы вам нужно очистить в первую очередь, прежде чем вы захотите очистить неиспользуемый инстанс EC2?


Попробуй сам!

Эти примеры только касаются синтаксиса поиска Resoto. Хотя этот пост относится к AWS, мы также поддерживаем GCP и DigitalOcean.

Resoto — это программа с открытым исходным кодом, размещенная на собственном хостинге и бесплатная для использования! Проверить наша документация и дайте Resoto спину!


Этот пост был первоначально опубликован моим коллегой Matthias Veit в 4 февраля 2022 г.