Антон Маркелов

Автоматизирую, поддерживаю, починяю примус

Navigation
 » Home
 » Обо мне
 » CV Rus
 » Resume Eng (PDF)
 » Github
 » XML Feed

Как сдампить существующую инфраструктуру в AWS в виде кода

30 Jan 2023 » devops

Вводная

💡 Интерфейс 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 надо будет допиливать руками