Повысьте эффективность с Terraform и используйте свой код
Terraform теперь является важным инструментом инфраструктура как код (IaC), который должен быть в вашем наборе инструментов в качестве специалиста по DevOps. Как и многие проекты с открытым исходным кодом, сообщество создает множество инструментов и делится ими, чтобы сделать его более мощным.
Иногда вокруг проекта слишком много инструментов и плагинов, и вы можете чувствовать себя потерянным. Вот почему здесь я собираюсь представить вам 5 инструментов Terraform, которые я использую ежедневно.
Они позволяют увеличить скорость и получить еще больше удовольствия от работы с Terraform:
- Переключение между разными версиями Terraform в ваших проектах.
- Выявляйте ошибки и улучшайте свой код.
- Автоматически создавайте документацию по коду.
- Обнаружение потенциальных проблем безопасности в вашем коде.
- Оценка облачной стоимости ваших изменений.
1. ТФсвитч
Terraform — это инструмент, который довольно быстро развивается и меняет версии. Вам необходимо скачать и установить правильную версию с веб-сайта HashiCorp. Для каждой отдельной версии вам нужен соответствующий двоичный файл. Когда у вас есть несколько проектов Terraform с разными версиями, управлять ими может стать очень тяжело.
TFSwitch — это инструмент командной строки, который решает эту проблему. Это позволяет вам выбрать версию Terraform, с которой вы хотите работать, и установить ее автоматически.
Установка на Mac
$ brew install warrensbox/tap/tfswitch
Установка в Linux
$ curl -L https://raw.githubusercontent.com/warrensbox/terraform-switcher/release/install.sh | bash
Быстрый старт
[1]: введите tfswitch
и нажмите «Ввод» на своем терминале.
[2]: выберите нужную версию Terraform с помощью стрелок вверх и вниз.
[3]: нажмите Enter, чтобы выбрать версию Terraform.
Вы также можете указать версию Terraform в командной строке:
2. ТФЛинт
Синтаксические ошибки иногда нелегко понять при запуске кода. Линтеры предоставляют важную информацию для ускорения отладки и экономии времени при разработке. Вы также можете интегрировать их в конвейер CI/CD для постоянного улучшения.
Terraform основан на HCL (HashiCorp Language), языке, описывающем состояние вашей инфраструктуры. TFLint — подключаемый линтер, поддерживающий Terraform и его язык. Помимо линтинга, это еще и фреймворк с расширяемыми функциями с помощью плагинов.
Вот что может сделать использование TFLint для вашего проекта IaC:
- Найдите возможные ошибки для основных облачных провайдеров: AWS/Azure/GCP.
- Предупреждать об устаревшем синтаксисе и неиспользуемых объявлениях.
- Применяйте передовой опыт и соглашения об именах.
Установка на Mac
$ brew install tflint
Установка в Linux
$ curl -s https://raw.githubusercontent.com/terraform-linters/tflint/master/install_linux.sh | bash
Установка в Windows
$ choco install tflint
Быстрый старт
TFLint по умолчанию проверяет файлы в текущем каталоге. Вы можете изменить поведение с помощью следующих аргументов:
$ tflint --help Usage: tflint [OPTIONS] [FILE or DIR...] Application Options: -v, --version Print TFLint version --init Install plugins --langserver Start language server -f, --format=[default|json|checkstyle|junit|compact] Output format (default: default) -c, --config=FILE Config file name (default: .tflint.hcl) --ignore-module=SOURCE Ignore module sources --enable-rule=RULE_NAME Enable rules from the command line --disable-rule=RULE_NAME Disable rules from the command line --only=RULE_NAME Enable only this rule, disabling all other defaults. Can be specified multiple times --enable-plugin=PLUGIN_NAME Enable plugins from the command line --var-file=FILE Terraform variable file name --var='foo=bar' Set a Terraform variable --module Inspect modules --force Return zero exit status even if issues found --no-color Disable colorized output --loglevel=[trace|debug|info|warn|error] Change the loglevel Help Options: -h, --help Show this help message
Вы также можете передать файл конфигурации в TFLint в соответствии с этим приоритетом:
- Текущий каталог (
./.tflint.hcl
) - Домашний каталог (
~/.tflint.hcl
)
В .tflint.hcl
вы можете выполнить следующие действия:
- Определите конфигурацию TFLint
- Объявить плагины для использования
- Включить/отключить определенные правила TFLint
Вот пример файла конфигурации TFLint:
config { plugin_dir = "~/.tflint.d/plugins" module = true force = false disabled_by_default = false ignore_module = { "terraform-aws-modules/vpc/aws" = true "terraform-aws-modules/security-group/aws" = true } varfile = ["example1.tfvars", "example2.tfvars"] variables = ["foo=bar", "bar=[\"baz\"]"] } plugin "aws" { enabled = true version = "0.12.0" source = "github.com/terraform-linters/tflint-ruleset-aws" } rule "aws_instance_invalid_type" { enabled = false }
Запустить TFLint просто:
$ tflint
Если вы не получаете ожидаемого поведения, вы можете увидеть подробные журналы с режимом отладки:
$ TFLINT_LOG=debug tflint
Используйте подключаемые модули для облачных провайдеров
Если вы используете поставщиков AWS, Azure или GCP, вы можете использовать соответствующий подключаемый модуль:
Блоки кода ниже указывают на использование подключаемого модуля AWS:
plugin "aws" { enabled = true version = "0.12.0" source = "github.com/terraform-linters/tflint-ruleset-aws" }
Следующая команда устанавливает плагины:
$ tflint --init
Terraform не проверяет проблемы, связанные с поставщиком. Вот пример со следующим файлом конфигурации:
resource "aws_instance" "foo" { ami = "ami-0ff8a91507f77f867" instance_type = "t1.2xlarge" # invalid type! }
t1.2xlarge
является недопустимым типом экземпляра. При запуске terraform apply
произойдет ошибка. Но команды terraform validate
и terraform plan
не показывают никакой ошибки. Это зависит от поставщика AWS, а не от синтаксиса Terraform. Плагин TFLint помогает обнаружить эту ошибку до применения кода:
3. Terraform-документы
Документирование вашего кода — важный момент для командной работы и повторного использования. Terraform-docs — это быстрая утилита для создания документов из модулей Terraform в различных выходных форматах.
Установка на Mac
$ brew install terraform-docs
Установка в Windows
$ choco install terraform-docs
Установка в Linux
$ curl -Lo ./terraform-docs.tar.gz https://github.com/terraform-docs/terraform-docs/releases/download/v0.16.0/terraform-docs-v0.16.0-$(uname)-amd64.tar.gz $ tar -xzf terraform-docs.tar.gz $ chmod +x terraform-docs $ mv terraform-docs /usr/local/terraform-docs
Быстрый старт
Создание модулей Terraform подразумевает использование входов, выходов, ресурсов и, в конечном итоге, источников данных. Следующий фрагмент Terraform создает экземпляр AWS EC2 из AMI (Amazon Machine Image). Хотя все в одном файле, его можно рассматривать как модуль:
terraform { required_version = ">= 1.0.0" required_providers { aws = { source = "hashicorp/aws" } } } variable "aws_region" { description = "The AWS region where to deploy the EC2 instance." type = string default = "us-east-1" } variable "tags" { description = "The tags to associate to the EC2 instance." type = map(string) default = {} } provider "aws" { region = var.aws_region } data "aws_ami" "ubuntu" { most_recent = true filter { name = "name" values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"] } filter { name = "virtualization-type" values = ["hvm"] } owners = ["099720109477"] } resource "aws_instance" "default" { ami = data.aws_ami.ubuntu.id instance_type = "t2.micro" tags = merge({ Name = "my-ec2-instance" }, var.tags) } output "arn" { description = "EC2 instance ARN." value = aws_instance.default.arn }
Приведенная ниже командная строка сгенерирует документацию Terraform в уценке и сохранит ее в файле README:
$ terraform-docs markdown table --output-file README.md .
В файле README мы находим различные элементы, используемые модулем, и ссылки на официальную документацию для каждого из них:
<!-- BEGIN_TF_DOCS --> ## Requirements | Name | Version | |------|---------| | <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0.0 | ## Providers | Name | Version | |------|---------| | <a name="provider_aws"></a> [aws](#provider\_aws) | 3.74.0 | ## Modules No modules. ## Resources | Name | Type | |------|------| | [aws_instance.default](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance) | resource | | [aws_ami.ubuntu](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami) | data source | ## Inputs | Name | Description | Type | Default | Required | |------|-------------|------|---------|:--------:| | <a name="input_aws_region"></a> [aws\_region](#input\_aws\_region) | The AWS region where to deploy the EC2 instance. | `string` | `"us-east-1"` | no | | <a name="input_tags"></a> [tags](#input\_tags) | The tags to associate to the EC2 instance. | `map(string)` | `{}` | no | ## Outputs | Name | Description | |------|-------------| | <a name="output_arn"></a> [arn](#output\_arn) | EC2 instance ARN. | <!-- END_TF_DOCS -->
4. Чеков
Checkov — инструмент статического анализа кода для сканирования инфраструктуры в виде файлов кода, включая Terraform. Он ищет неправильную конфигурацию, которая может привести к проблемам с безопасностью или соответствием требованиям. Он имеет 750 предопределенных политик для проверки распространенных проблем с неправильной настройкой.
Монтаж
$ pip install checkov
Быстрый старт
Код части, представленной на части, мы возьмем на terraform-docs. Сгенерируем план Terraform и проанализируем его с помощью Checkov:
$ terraform init $ terraform plan -out tf.plan $ terraform show -json tf.plan > tf.json $ checkov -f tf.json _ _ ___| |__ ___ ___| | _______ __ / __| '_ \ / _ \/ __| |/ / _ \ \ / / | (__| | | | __/ (__| < (_) \ V / \___|_| |_|\___|\___|_|\_\___/ \_/ By bridgecrew.io | version: 2.0.528 Update available 2.0.528 -> 2.0.829 Run pip3 install -U checkov to update cloudformation scan results: Passed checks: 0, Failed checks: 0, Skipped checks: 0, Parsing errors: 1 Error parsing file tf.json terraform_plan scan results: Passed checks: 2, Failed checks: 4, Skipped checks: 0 Check: CKV_AWS_88: "EC2 instance should not have public IP." PASSED for resource: aws_instance.default File: /tf.json:0-0 Guide: https://docs.bridgecrew.io/docs/public_12 Check: CKV_AWS_46: "Ensure no hard-coded secrets exist in EC2 user data" PASSED for resource: aws_instance.default File: /tf.json:0-0 Guide: https://docs.bridgecrew.io/docs/bc_aws_secrets_1 Check: CKV_AWS_79: "Ensure Instance Metadata Service Version 1 is not enabled" FAILED for resource: aws_instance.default File: /tf.json:0-0 Guide: https://docs.bridgecrew.io/docs/bc_aws_general_31 Check: CKV_AWS_126: "Ensure that detailed monitoring is enabled for EC2 instances" FAILED for resource: aws_instance.default File: /tf.json:0-0 Guide: https://docs.bridgecrew.io/docs/ensure-that-detailed-monitoring-is-enabled-for-ec2-instances Check: CKV_AWS_135: "Ensure that EC2 is EBS optimized" FAILED for resource: aws_instance.default File: /tf.json:0-0 Guide: https://docs.bridgecrew.io/docs/ensure-that-ec2-is-ebs-optimized Check: CKV_AWS_8: "Ensure all data stored in the Launch configuration EBS is securely encrypted" FAILED for resource: aws_instance.default File: /tf.json:0-0 Guide: https://docs.bridgecrew.io/docs/general_13
5. Infracost: оцените стоимость облака из своего кода
Изменения, внесенные Terraform, могут изменить статус ресурсов, размещенных у облачного провайдера. В зависимости от них стоимость может варьироваться. Важно помнить об этом аспекте при написании кода IaC.
Infracost показывает оценки стоимости облака для проектов инфраструктуры как кода, таких как Terraform. Это помогает быстро увидеть разбивку затрат и заранее сравнить различные варианты.
Установка на Mac
$ brew install infracost
Установка в Linux
$ /usr/local/bin curl -fsSL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh | sh
Быстрый старт
Зарегистрируйте infracost со своим адресом электронной почты, чтобы получить ключ API:
$ infracost register
Теперь ваш ключ API находится в $HOME/.config/infracost/credentials.yml
Вы можете использовать инфракост, чтобы получить полную ежемесячную разбивку затрат:
$ infracost breakdown --path . Detected Terraform directory at . ✔ Checking for cached plan... not found ✔ Running terraform plan ✔ Running terraform show ✔ Extracting only cost-related params from terraform ✔ Retrieving cloud prices to calculate costs Project: . Name Monthly Qty Unit Monthly Cost aws_instance.default ├─ Instance usage (Linux/UNIX, on-demand, t2.micro) 730 hours $8.47 └─ root_block_device └─ Storage (general purpose SSD, gp2) 8 GB $0.80 OVERALL TOTAL $9.27 ────────────────────────────────── 1 cloud resource was detected, rerun with --show-skipped to see details: ∙ 1 was estimated, 1 includes usage-based costs, see https://infracost.io/usage-file
Вы также можете обнаружить изменение месячной стоимости из-за смены кода:
$ infracost diff --path . Detected Terraform directory at . ✔ Checking for cached plan... change detected ✔ Running terraform plan ✔ Running terraform show ✔ Extracting only cost-related params from terraform ✔ Retrieving cloud prices to calculate costs Project: . ~ aws_instance.default +$21.90 ($9.27 → $31.17) ~ Instance usage (Linux/UNIX, on-demand, t2.micro → t3.medium) +$21.90 ($8.47 → $30.37) Monthly cost change for . Amount: +$21.90 ($9.27 → $31.17) Percent: +236% ────────────────────────────────── Key: ~ changed, + added, - removed 1 cloud resource was detected, rerun with --show-skipped to see details: ∙ 1 was estimated, 1 includes usage-based costs, see https://infracost.io/usage-file Add cost estimates to your pull requests: https://infracost.io/cicd
Вы также можете создать отчет в формате HTML:
$ infracost breakdown --path . --format html > report.html Detected Terraform directory at . ✔ Checking for cached plan... found ✔ Extracting only cost-related params from terraform ✔ Retrieving cloud prices to calculate costs
Заключение
5 инструментов Terraform, которые мы рассмотрели вместе в этой статье, принесут вам преимущества в нескольких аспектах:
- Ускорьте отладку кода и предупредите ошибки с помощью TFLint
- Ограничение повторяющихся задач: управление версиями с помощью TFSwitch и автоматизация документации с помощью Terraform-Docs.
- Выявление проблем безопасности во время разработки с помощью Checkov
- Получите представление о влиянии изменений вашей инфраструктуры на затраты с помощью Infracost
Вы также можете интегрировать все эти инструменты в свои конвейеры CI/CD!
Спасибо! 🙏 Надеюсь, эта статья помогла вам найти свой следующий замечательный инструмент Terraform. Хотите узнать больше о DevOps? Чтобы ознакомиться с другими статьями, подобными этой, она находится ниже! ⬇️