Использование Terraform в Облаке КРОК
О технологиях

Использование Terraform в Облаке КРОК

5603
18 минут

С недавнего времени в Облаке КРОК появилась поддержка Terraform – средства декларативного управления вашей виртуальной инфраструктурой. Terraform позволяет безопасно и предсказуемо создавать, изменять и улучшать вашу инфраструктуру.

Terraform избавляет от вас необходимость напрямую использовать API-интерфейсы не только Облака КРОК, но и AWS, Google Cloud, Azure или DigitalOcean, давая вам возможность использовать декларативные конфигурационные файлы, в которые могут использоваться всеми членами вашей команды разработки или эксплуатации. Другими словами, описание вашей инфраструктуры может изменяться и версионироваться так же, как и программное обеспечение, которое работает поверх нее.

Вся суть работы с Terraform сводится к тому, чтобы:


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

При этом описанная вами инфраструктура каждый раз будет развернута совершенно одинаково, и это не зависит от того, где именно вы ее разворачиваете: в облаке КРОК, AWS, Google, Azure, DigitalOcean, платформах виртуализации таких как OpenStack или же непосредственно на железе.

Установка Terraform

Скачайте последнюю поддерживаемую версию Terraform (на момент написания статьи это версия v0.7.13): Скачать Terraform.

Распакуйте архив и положите исполняемый файл в любую удобную вам директорию, например, ~/bin/ (я кладу ПО, распространяющееся в виде уже скомпилированных исполняемых файлов в эту директорию). В моем случае:


$ mkdir -p ~/bin $ unzip ~/Downloads/linux_amd64.zip -d ~/bin

Добавьте эту директорию в переменную окружения PATH, что иметь возможность выполнять команду Terraform без указания пути до нее: vi ~/.bash_profile:

export PATH=$PATH:~/bin


Выполните следующую команду для обновления сессии терминала:

$ source ~/.bash_profile


Для того чтобы проверить инсталляцию Terraform, выполните следующую команду и убедитесь, что ваш вывод совпадает с продемонстрированым:


$ terraform --version Terraform v0.7.13 Если вывод совпадает,
значит, вы правильно установили Terraform. Если что-то не так, вернитесь
на шаг назад и попробуйте установить его еще раз. Также вы можете задать ваш
вопрос в обсуждении этой статьи, и мы обязательно вам поможем.

Создание директории проекта

Первый шаг к созданию вашей инфраструктуры при помощи Terraform — это создание директории проекта, в которой будут храниться файлы конфигурации. Имя директории не имеет значения, поэтому мы будем использовать «croc_terraform_example» для примера (вы можете изменить свое название):


$ mkdir ~/croc_terraform_example $ cd ~/croc_terraform_example

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

Если что-то идет не так

Если что-то идет не так, и Terraform не работает так, как ожидается, вы всегда можете начать заново, предварительно удалив файл terraform.tfstate и в ручную удалив созданные ресурсы.


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


$ export TF_LOG=1

Создание конфигурации провайдера

Terraform поддерживает множество провайдеров услуг при помощи описания «providers». Так как Облако КРОК ориентируется на AWS API, то мы будем использовать далее именно провайдера для AWS. Давайте настроим его.


Создайте файл с именем provider.tf:

$ vi provider.tf


Добавьте в этот файл следующие строки:

variable «c2_access_key» {}

variable «c2_secret_key» {}

provider «aws» {

endpoints {

ec2 = «https://api.cloud.croc.ru:443/»

s3 = «https://storage.cloud.croc.ru:443» // ВНИМАНИЕ: пока не поддерживается

}

skip_credentials_validation = true

skip_requesting_account_id = true

access_key = «${var.c2_access_key}»

secret_key = «${var.c2_secret_key}»

region = «us-east-1» // регион в Облаке КРОК не имеет значения, но т.к. для работы с AWS он требуется, нужно указать любой существующий AWS-регион

}


В этом файле определяется провайдер подключения к Облаку КРОК, а также две переменные, предназначенные для передачи ключей доступа для обращения к API Облака. Ключи доступа можно получить перейдя в «Настройки» вашей Консоли управления и кликнув на «Получить настройки для доступа по API». Настройки доступа будут скачаны в виде файла c2rc.sh, который необходимо положить в директорию с проектом.


Измените значение переменной C2_PROJECT в файле c2rc.sh. Она должна содержать название вашего проекта.


Примените в ваше окружение переменные, определенные в c2rc.sh:

$ source c2rc.sh


Проверим, что Terraform может подключиться к Облаку, запустив команду terraform plan со следующими аргументами:


$ terraform plan -var «c2_access_key=${AWS_ACCESS_KEY_ID}» -var «c2_secret_key=${AWS_SECRET_ACCESS_KEY}»


При запуске команды terraform plan (показать какие изменения Terraform должен сделать с инфраструктурой, определенной в конфигурационных файлах) при помощи ключа -var мы определяем переменные c2_access_key и c2_secret_key при помощи переменных окружения AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, заданных из файла c2rc.sh на прошлом шаге.


Т.к. мы еще не определили ни одного ресурса в нашей конфигурации, ваш вывод команды должен совпадать с показанным выше.

Виртуальные частные облака (VPC)

С недавних пор в Облаке КРОК как и в AWS отказались от использования общего маршрутизируемого адресного пространства в Облаке, оставив пользователям возможность запускать свои виртуальные инфраструктуры только внутри изолированных сетевых сегментов (VPC). То есть для того, чтобы иметь возможность развернуть свою инфраструктуру, пользователь сначала должен создать и запустить в своей учетной записи VPC.


Для того, чтобы определить VPC в вашей виртуальной инфраструктуре, в которой будут располагаться виртуальные машины, в директории ~/croc_terraform_example создайте файл example_vpc.tf и следующего содержания:


resource «aws_vpc» «example_vpc» {

cidr_block = «192.168.0.0/16»

}

resource «aws_subnet» «external_subnet» {

vpc_id = «${aws_vpc.example_vpc.id}»

cidr_block = «192.168.1.0/24»

}

Первый блок содержит описание Виртуального Частного Облака (VPC), в котором Terraform создаст Виртуальную сеть, определенную во втором блоке. Общее адресное пространство для VPC задано в переменной cidr_block в ресурсе aws_vpc с именем example_vpc. Адресное пространство Виртуальной сети задается по аналогии в блоке aws_subnet.

Правила фаервола

Для того, чтобы для определенной нами Виртуальной сети задать правила фаервола, необходимо описать ресурсы aws_security_group_rule. В качестве примера приведу определение ресурса, разрешающего SSH подключения к виртуальным машинам. Делается это вот так:


resource «aws_security_group_rule» «ssh_access» {

type = «ingress»

from_port = 22

to_port = 22

protocol = «tcp»

cidr_blocks = [«0.0.0.0/0»]

security_group_id = «${aws_subnet.external_subnet.id}»

}


Т.е. в ресурсе aws_security_group_rule с именем ssh_access определено следующее правило:


  • type = «ingress» — правило для входящего трафика
  • from_port = 22 — начальный порт диапазона портов, на которые будут разрешены подключения
  • to_port = 22 — конечный порт диапазона
  • protocol = «tcp» — правило для TCP протокола
  • cidr_blocks = [«0.0.0.0/0»]— адреса с которых разрешены подключения
  • security_group_id = «${aws_subnet.external_subnet.id}» — ID определенной выше виртуальной сети

Виртуальная машина

Для завершения примера давайте определим в нашей виртуальной сети запуск хотя бы одной виртуальной машины:


resource «aws_instance» «coreos-1» {

ami = «cmi-11CCE5BA»

instance_type = «m1.large»

subnet_id = «${aws_subnet.external_subnet.id}»

depends_on = [«aws_subnet.external_subnet»]

monitoring = true

key_name = «Lenovo-T410»

}


В данном примере при помощи ресурса aws_instance с именем coreos-1 я запускаю виртуальную машину с ОС CoreOS из собственного шаблона со следующими параметрами:


  • ami = «cmi-11CCE5BA» — ID Шаблона Виртуальной машины
  • instance_type = «m1.large» — размер виртуальной машины
  • subnet_id = «${aws_subnet.external_subnet.id}» — подключить виртуальную машину к сети external_subnet
  • depends_on = [«aws_subnet.external_subnet»] — создавать и изменять этот ресурс после того,
    как изменена или создана виртуальная сеть
    external_subnet
  • monitoring = true — включить Мониторинг виртуальной машины
  • key_name = «Lenovo-T410» — имя вашего публичного SSH-ключа, используемого в Web-интерфейсе Консоли управления Облаком

Автоматическое создание инфаструктуры

В результате наших с вами совместных действий получился небольшой проект:


$ tree croc_terraform_example

croc_terraform_example

├── c2rc.sh

├── example_vpc.tf

├── provider.tf


Содержание example_vpc.tf:


variable "c2_access_key" {}

variable "c2_secret_key" {}

 

provider "aws" {

endpoints {

    ec2 = "https://api.cloud.croc.ru:443/"

    s3 = "https://storage.cloud.croc.ru:443"

}

 

skip_credentials_validation = true

skip_requesting_account_id = true

access_key = "${var.c2_access_key}"

secret_key = "${var.c2_secret_key}"

region = "us-east-1"

}


Содержание example_vpc.tf:


resource "aws_vpc" "example_vpc" {

cidr_block = "192.168.0.0/16"

}

 

resource "aws_subnet" "external_subnet" {

vpc_id = "${aws_vpc.example_vpc.id}"

cidr_block = "192.168.1.0/24"

}

 

resource "aws_security_group_rule" "ssh_access" {

type = "ingress"

from_port = 22

to_port = 22

protocol = "tcp"

cidr_blocks = ["0.0.0.0/0"]

security_group_id = "${aws_subnet.external_subnet.id}"

}

 

resource "aws_instance" "coreos-1" {

ami           = "cmi-11CCE5BA"

instance_type = "m1.large"

subnet_id     = "${aws_subnet.external_subnet.id}"

depends_on    = ["aws_subnet.external_subnet"]

monitoring    = true

key_name = "Lenovo-T410"

}


Для того, чтобы посмотреть на планируемые изменения, выполните команду:

terraform plan -var "c2_access_key=${AWS_ACCESS_KEY_ID}" -var "c2_secret_key=${AWS_SECRET_ACCESS_KEY}"


Посмотреть взаимосвязи описанных вами ресурсов и переменных можно при помощи следующих команд:

terraform graph | dot -Tpng > graph.png

open graph.png


Утилита dot входит в состав библиотеки GraphViz.

Чтобы применить изменения и создать инфраструктуру, выполните:

terraform apply -var "c2_access_key=${AWS_ACCESS_KEY_ID}" -var "c2_secret_key=${AWS_SECRET_ACCESS_KEY}"


Чтобы полностью удалить инфраструктуру:

terraform destroy -var "c2_access_key=${AWS_ACCESS_KEY_ID}" -var "c2_secret_key=${AWS_SECRET_ACCESS_KEY}"

Заключение

Terraform представляет собой чрезвычайно мощный инструмент, предназначенный для декларативного создания, изменения и удаления вашей инфраструктуры в различных облачных средах. В этой статье мы создали очень простую инфраструктуру, состоящую из VPC, Виртуальной сети, правила фаервола и виртуальной машины. В следующей статье я покажу как при помощи Terraform создать отказоустойчивый кластер CoreOS, развернуть поверх него Docker Swarm, а следом запустить в контейнерах отказоустойчивую инсталляцию MySQL (Active-Active), к которой мы подключим масштабируемый бекенд с WordPress.


Более того, созданная вами в следующей статье архитектура, позволит вам не только развернуть отказоустойчивое LAMP Web-приложение у любого облачного провайдера, но и чрезвычайно просто и в считанные мгновения смигрировать его в любое другое Облако или Датацентр при необходимости!


Подписывайтесь на обновления! Впереди масса всего интересного!

12 декабря 2023
KT.Team создала полностью автоматизированную систему маркировки товаров для FM Logistic на базе Облака КРОК
KT.Team разработала для международной логистической корпорации FM Logistic решение, помогающее максимально упростить процесс взаимодействия производителей и продавцов с Государственной информационной системой мониторинга оборота товаров (ГИС МТ). Решение называется “Paradigma” и развернуто на базе Облака КРОК, которое обеспечивает надежную платформу для его функционирования.
0 минут
459
8 декабря 2023
КРОК Облачные сервисы поможет компаниям защитить свою облачную инфраструктуру
КРОК Облачные сервисы совместно с «К2 Кибербезопасность» запустили Cloud Security Services (CSS) – комплекс мер и сервисов по обеспечению защиты ИТ-инфраструктуры клиента в облачных средах. Он позволяет выявлять, приоритизировать и митигировать риски и решать проблемы соответствия требованиям регуляторов по защите ИТ-инфраструктуры.
2 минуты
441
1 декабря 2023
КРОК Облачные сервисы первыми из облачных провайдеров получили сертификат PCI DSS 4.0

КРОК Облачные сервисы стал первым облачным провайдером в России, который получил сертификат соответствия новому стандарту безопасности данных платежных карт PCI DSS 4.0. Эта версия станет обязательной к исполнению с 2025 года вместо стандарта PCI DSS 3.2.1., действующего с 2018 г.  За прошедшее время, угрозы и методы защиты данных ушли далеко вперед. В стандарте PCI DSS 4.0 углублен и расширен базовый уровень операционных и технических требований для повышения безопасности платежей и прописаны инновационные методы для борьбы с новыми угрозами.

2 минуты
613
1 ноября 2023
Незаменимых нет. Сервис на базе Nextcloud вместо привычных корпоративных облаков

Привет, Хабр! Меня зовут Александр Фикс, я менеджер по развитию бизнеса КРОК Облачные сервисы. Сегодня поговорим о тренде локализации, о том, что происходит на рынке файлообменников с уходом западных решений и какие альтернативные продукты есть у бизнеса в данный момент.

1 минута
876
19 октября 2023
Контейнеры: технологии и процессы глазами разработчика

В выпуске#9 видеоподкаста «Откровенно об ИТ-инфраструктуре» поговорили о роли контейнеров в разработке. Приглашенные эксперты обсудили специфику использования Kubernetes и сокращение time-to-market в контексте контейнеризации.

В гостях Михаил Гудов, Orion soft, и Василий Колосов, Smartex.
1 минута
788
scrollup