Вводная
💡 Интерфейс AWS придуман инопланетянами для опытов над людьми, поэтому понять, какие сущности у нас там есть - довольно сложно. Гораздо проще сдампить всю информацию в виде инфраструктурного кода и ревьюить её уже там.
Вообще, на рынке довольно много подобных утилит (https://www.reddit.com/r/aws/comments/shb053/is_there_a_good_tool_to_map_out_aws/ - вот тут например перечисляется большое число сервисов), но часть из них подзаброшены, часть идут за деньги, а часть используют managed подход, а давать креды от AWS каким-то дядям не очень хочется.
Так что для дампа информации об инфраструктуре мы будем использовать https://github.com/GoogleCloudPlatform/terraformer - утилиту, сделанную инженерами из Google, что обеспечивает довольно высокий уровень поддержки и доверия к ней. Стандартные средства AWS тоже бы подошли, думаю, но у нас инфра не только в AWS, так что хочется универсальности.
В документации написано, что последняя версия поддерживает Terraform 0.13, но у меня всё отлично завелось и на свежих версиях Terraform (1.2.x и 1.3.x на момент написания статьи).
Алгоритм
- Ставим Terraform (рекомендую это делать через https://github.com/tfutils/tfenv, чтобы легко переключаться между версиями)
- Ставим Terraformer
- Сетапим доступ до AWS (процесс аналогичен сетапу CLI-утилиты aws, Terraform возьмет креды из
~/.aws/credentials
) - Создаем необходимую структуру директорий и качаем AWS provider для Terraform
mkdir terraformer
cd terraformer
echo 'provider "aws" {}' > main.tf
terraform init
- В результате в директории создадутся все необходимые для работы файлы (
.terraform
и.terraform.lock.hcl
) - Запускаем
terraformer
обнюхивать нашу инфраструктуру
terraformer import aws --resources=* --regions=us-east-1 -o aws -p {output}/
- Коротко по опциям (если что всё есть в доке - https://github.com/GoogleCloudPlatform/terraformer#readme)
import aws
- импортируй в код инфру из AWS. Помимо Амазона поддерживается несколько десятков других провайдеров, в том числе и CloudFlare--resources=*
- импортируй все ресурсы. Можно сдампить только определенный тип ресурсов, если нужно будет аудитить только какие-то конкретные штуки например--regions=us-east-2
- импортируй данные только с этого региона. По дефолту сдампит со всех регионов. Глобальные сущности (IAM, пользователи например) сдампятся в любом случае-o aws
- в какую директорию дампить-p {output}/
- какую структуру директорий создавать. По умолчанию используется паттерн{output}/{provider}/{service}/
(т.е. код раскладывается по разным директориям в зависимости от сервиса), что в моем случае оказалось не очень удобно
- Ну и всё, через какое-то время он вываливает всё описание куда ему сказали и можно начинать ревьюить. В результате выплёвывается как код Terraform (файлы
.tf
), так и стейт (файлы.tfstate
), что удобно.
Известные проблемы
- С поддержкой AWS всё хорошо, но у CloudFlare не поддерживаются Cloudflare Pages например
- Время от времени вываливает какие-то ошибки, на описании инфраструктуры это не очень сказалось, но скорее всего код для использования в Terraform надо будет допиливать руками