Автоматизируйте оценку стоимости облака в ваших запросах на вытягивание

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

В этой статье мы увидим, как сделать это более увлекательным способом. Как вы знаете, облачная инфраструктура часто управляется как код. Наиболее часто используемым инструментом является Terraform. Он способен отслеживать изменения между кодом и тем, что существует.

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

Что такое Инфракост?

Infracost показывает оценки стоимости облака для проектов инфраструктуры как кода, таких как Terraform. Это помогает DevOps, SRE и разработчикам быстро увидеть разбивку затрат и заранее сравнить различные варианты. https://github.com/infracost/infracost

Infracost — это простой исполняемый файл. Поэтому его очень просто установить и использовать в конвейере CI/CD. Здесь мы будем использовать его с Terraform, но в дорожной карте проекта планируется использовать его с другими инструментами, такими как Pulumi или CloudFormation.

После загрузки Infracost просто нужно зарегистрировать, и вперед!

$ infracost register 
Please enter your name and email address to get an API key. See our FAQ (https://www.infracost.io/docs/faq) for more details. 
Name: Guillaume Vincent 
Email: [email protected] 
Thank you Guillaume Vincent! Your API key is: xxxxxxxxxxxxxxxxxxxxxxxxx 
Success: Your API key has been saved to /Users/gvincent/.config/infracost/credentials.yml You can now run infracost breakdown --path=... and point to your Terraform directory or JSON/plan file.

Оценка стоимости

Полная разбивка затрат

Инфракост может быть выполнен для получения полной месячной разбивки затрат:

$ infracost breakdown --path terraform_nlb_static_eips
Detected Terraform directory at terraform_nlb_static_eips
  ✔ Running terraform init
  ✔ Running terraform plan
  ✔ Running terraform show
✔ Calculating monthly cost estimate
Project: terraform_nlb_static_eips
Name                                                      Monthly Qty  Unit            Monthly Cost
aws_autoscaling_group.webserver
 └─ aws_launch_configuration.webserver
    ├─ Instance usage (Linux/UNIX, on-demand, t2.micro)              0  hours                  $0.00
    ├─ EC2 detailed monitoring                                       0  metrics                $0.00
    └─ root_block_device
       └─ Storage (general purpose SSD, gp2)                         0  GB-months              $0.00
aws_eip.nlb
 └─ IP address (if unused)                                         730  hours                  $3.65
aws_lb.this
 ├─ Network load balancer                                          730  hours                 $16.42
 └─ Load balancer capacity units                         Cost depends on usage: $0.006 per LCU-hours
PROJECT TOTAL                                                                                $20.07

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

Разница ежемесячных затрат между текущим и запланированным состоянием

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

Чтобы проиллюстрировать вам это, я развернул первоначальную версию кода, используя terraform apply. Затем я масштабировал текущий тип инстанса EC2 с t2.micro до m4.large:

$ git --no-pager diff                                                                                                                             
diff --git a/launch-configuration.tf b/launch-configuration.tf
index db22265..bcf90c7 100644
--- a/launch-configuration.tf
+++ b/launch-configuration.tf
@@ -1,7 +1,7 @@
 resource "aws_launch_configuration" "webserver" {
   name_prefix                 = "${local.name_prefix}_webserver"
   image_id                    = data.aws_ami.ubuntu.image_id
-  instance_type               = "t2.micro"
+  instance_type               = "m4.large"
   security_groups             = [
  aws_security_group.public.id]
   user_data                   = data.template_cloudinit_config.this.rendered

Затем я запускаю команду Infracost с аргументом diff:

$ infracost diff --path .                                                                                                                                                                           
Detected Terraform directory at .
  ✔ Running terraform plan
  ✔ Running terraform show
✔ Calculating monthly cost estimate
Project: .
~ aws_autoscaling_group.webserver
  +$64.53 ($11.37 -> $75.90)
~ aws_launch_configuration.webserver
- Instance usage (Linux/UNIX, on-demand, t2.micro)
          -$8.47
+ Instance usage (Linux/UNIX, on-demand, m4.large)
          +$73.00
Monthly cost change for .
Amount:  +$64.53 ($27.79 -> $92.32)
Percent: +232%

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

Уточнить оценку затрат с помощью файла использования

Вы можете передать Infracost файл использования, чтобы уточнить оценку стоимости:

Этот файл добавляется к аргументам команды:

$ infracost breakdown --path . --format html > report.html

Отчет

Вы можете создавать отчеты для обмена оценками затрат в различных форматах (HTML, JSON и т. д.):

Добавление Infracost в действие GitHub

Вы можете интегрировать Infracost с множеством решений CI/CD. Здесь мы сосредоточимся на Github Action, потому что можно легко повторно использовать существующие действия из маркетплейса. В рабочем процессе мы будем использовать следующие действия:

Конфигурация рабочего процесса настраивается в проекте terraform git in.github/workflows/infracost.yml:

Я зафиксировал предыдущее изменение типа экземпляра в ветке с именем dev и открыл запрос на извлечение. Это запускает этапы рабочего процесса:

Когда рабочий процесс завершается, выходные данные Infracost видны внутри запроса на включение:

Ресурсы