[Перевод] Начинаем работать с Terraform

21739c8b617ed739d67545c94780544e.png

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

Именно для тех, кто хочет применять Terraform по работе или для собственных нужд, мы перевели эту статью автора Майкла Кинга (Michael King).

Мы рассмотрим основы Terraform и расскажем об инструментах, необходимых для начала работы. Продемонстрируем настройку рабочей среды, написание первого кода и развертывание инфраструктуры.

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

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

provider "aws" {
 region = "us-east-1"
}

resource "aws_instance" "example" {
 ami           = "ami-0c55b159cbfafe1f0"
 instance_type = "t2.micro"

 tags = {
   Name = "example-instance"
 }
}

Ресурсы и их свойства определяются при помощи ясного и лаконичного синтаксиса. Давайте взглянем на код, который мы использовали для создания инстанса EC2.

Для начала определим облачного провайдера, с которым мы хотим работать (в данном случае — AWS). Затем мы создаем блок resource, который определяет свойства нашего инстанса, такие как AMI и тип. Наконец, мы добавляем блок tags, чтобы задать имя для нашего инстанса.

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

Мы рассмотрели основы Terraform. Давайте перейдем к деталям развертывания кода.

1. Прежде всего, было бы неплохо перейти в каталог, где сохранен код Terraform. Инициализируйте рабочий каталог, запустив команду terraform init. Она загрузит и установит все необходимые плагины и модули для вашего кода.

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

3. Наконец, вы готовы применить изменения. Воспользуйтесь командой terraform apply. Она создаст ресурсы в инфраструктуре в соответствии с написанным вами кодом. Terraform запросит подтверждение, прежде чем вносить изменения. Как только вы подтвердите изменения, Terraform развернет код на вашей инфраструктуре.

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

Теперь давайте поговорим о переменных и локальных значениях в Terraform. Это невероятно полезные инструменты, которые помогают писать гибкий и переиспользуемый код.

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

variable "region" {
 type    = string
 default = "us-west-2"
}

resource "aws_instance" "example" {
 ami           = "ami-0c55b159cbfafe1f0"
 instance_type = "t2.micro"
 region        = var.region
}

В этом примере определили переменную region с дефолтным значением us-west-2. Затем мы обращаемся к этой переменной в атрибуте region нашего ресурса aws_instance, используя синтаксис var.

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

variable "environment" {
 type    = string
 default = "prod"
}

locals {
 instance_name = "${var.environment}-web-server"
}

resource "aws_instance" "example" {
 ami           = "ami-0c55b159cbfafe1f0"
 instance_type = "t2.micro"
 tags = {
   Name = local.instance_name
 }
}

В этом примере определили локальное значение instance_name, которое объединяет значение переменной environment с описательной строкой. Затем мы обращаемся к этому локальному значению в теге Name нашего ресурса aws_instance.

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

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

Одной из наиболее часто используемых в Terraform является функция count. Она позволяет создать несколько инстансов одного ресурса с разными именами или параметрами без необходимости писать один и тот же код снова и снова. Предположим, вы хотите создать три инстанса EC2. Вместо того чтобы три раза писать один и тот же код, можно использовать count, чтобы сделать это за один раз:

resource "aws_instance" "example" {
 count         = 3
 ami           = "ami-0c55b159cbfafe1f0"
 instance_type = "t2.micro"
}

Этот код создаст три инстанса EC2 с одинаковым AMI и типом инстанса, но с разными именами: example[0], example[1] и example[2]. Проще простого!

Другая полезная функция — for_each. Она работает аналогично count, но вместо создания нескольких инстансов одного ресурса позволяет создать несколько ресурсов с разными именами и параметрами. Предположим, вы хотите создать несколько инстансов EC2 с разными AMI и типами инстанса:

variable "instances" {
 type = map(object({
   ami           = string
   instance_type = string
 }))
 default = {
   "web-server-1" = {
     ami           = "ami-0c55b159cbfafe1f0"
     instance_type = "t2.micro"
   }
   "web-server-2" = {
     ami           = "ami-0c55b159cbfafe1f0"
     instance_type = "t2.small"
   }
 }
}

resource "aws_instance" "example" {
 for_each = var.instances
 ami           = each.value.ami
 instance_type = each.value.instance_type
 tags = {
   Name = each.key
 }
}

Этот код создаст два инстанса EC2: один с AMI ami-0c55b159cbfafe1f0 и типом инстанса t2.micro, другой с AMI ami-0c55b159cbfafe1f0 и типом инстанса t2.small. Инстансы будут названы web-server-1 и web-server-2.

Функции count и for_each — лишь пара примеров из множества полезных функций, которые можно использовать в Terraform для еще более эффективного управления инфраструктурой.

Есть еще одна важная вещь, которой мы бы хотели бы поделиться.

Файл состояния — основа всей настройки Terraform. Он содержит всю информацию, которую Terraform должен знать о вашей инфраструктуре, чтобы отслеживать: что было создано, а что еще нужно создать.

Это JSON, который отслеживает текущее состояние инфраструктуры. Terraform использует такой файл для планирования и внесения изменений в вашу инфраструктуру. Если хотите узнать, какие изменения были внесены, можете использовать файл состояния для сравнения текущего состояния с предыдущим.

Когда вы начинаете работать с Terraform, хранить файл состояния можно локально или удаленно. Локальное состояние хранится на компьютере, на котором выполняется код Terraform, тогда как удаленное находится в централизованной локации, такой как бакет S3 или БД.

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

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

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

Выбор между локальным и удаленным хранением в значительной степени зависит от требований к инфраструктуре. Если вы работаете в одиночку, локальное хранение — хороший вариант. Однако при работе командой или управлении крупной инфраструктурой ваш путь к успеху — удаленное хранение.

Теперь вы знаете, как использовать и развертывать код в Terraform. Этот навык поможет автоматизировать инфраструктуру, управлять облачными ресурсами и оптимизировать процессы. Еще вы можете работать в команде, делиться своим кодом и улучшать общую производительность.

Terraform — это не просто инструмент, это образ мышления. Он учит вас думать об инфраструктуре как о коде, систематически проектировать, тестировать, развертывать и масштабировать.

Для тех, кто уже овладел основами Terraform и готов двигаться дальше, у нас есть курс Terraform База, если же вы у вас есть все бозовые знания, тогда вам на Terraform Мегу для продвинутых.

© Habrahabr.ru